xref: /titanic_52/usr/src/uts/common/sys/dld.h (revision e7801d59e8ceda0cde8ebdfdddd7582ee2ea96ef)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5ba2e4443Sseb  * Common Development and Distribution License (the "License").
6ba2e4443Sseb  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22d62bc4baSyz147064  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #ifndef	_SYS_DLD_H
277c478bd9Sstevel@tonic-gate #define	_SYS_DLD_H
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate /*
327c478bd9Sstevel@tonic-gate  * Data-Link Driver (public header).
337c478bd9Sstevel@tonic-gate  */
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate #include <sys/types.h>
367c478bd9Sstevel@tonic-gate #include <sys/stream.h>
37d62bc4baSyz147064 #include <sys/conf.h>
38d62bc4baSyz147064 #include <sys/sad.h>
397c478bd9Sstevel@tonic-gate #include <net/if.h>
40*e7801d59Ssowmini #include <sys/ddi.h>
41*e7801d59Ssowmini #include <sys/sunddi.h>
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
447c478bd9Sstevel@tonic-gate extern "C" {
457c478bd9Sstevel@tonic-gate #endif
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate /*
487c478bd9Sstevel@tonic-gate  * Data-Link Driver Information (text emitted by modinfo(1m))
497c478bd9Sstevel@tonic-gate  */
507c478bd9Sstevel@tonic-gate #define	DLD_INFO	"Data-Link Driver v%I%"
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate /*
537c478bd9Sstevel@tonic-gate  * Options: To enable an option set the property name to a non-zero value
547c478bd9Sstevel@tonic-gate  *	    in kernel/drv/dld.conf.
557c478bd9Sstevel@tonic-gate  */
567c478bd9Sstevel@tonic-gate 
577c478bd9Sstevel@tonic-gate /*
587c478bd9Sstevel@tonic-gate  * Prevent use of the IP fast-path (direct M_DATA transmit).
597c478bd9Sstevel@tonic-gate  */
607c478bd9Sstevel@tonic-gate #define	DLD_PROP_NO_FASTPATH	"no-fastpath"
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate /*
637c478bd9Sstevel@tonic-gate  * Prevent advertising of the DL_CAPAB_POLL capability.
647c478bd9Sstevel@tonic-gate  */
657c478bd9Sstevel@tonic-gate #define	DLD_PROP_NO_POLL	"no-poll"
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate /*
687c478bd9Sstevel@tonic-gate  * Prevent advertising of the DL_CAPAB_ZEROCOPY capability.
697c478bd9Sstevel@tonic-gate  */
707c478bd9Sstevel@tonic-gate #define	DLD_PROP_NO_ZEROCOPY	"no-zerocopy"
717c478bd9Sstevel@tonic-gate 
727c478bd9Sstevel@tonic-gate /*
739c175129Sja97890  * Prevent advertising of the DL_CAPAB_SOFTRING capability.
749c175129Sja97890  */
759c175129Sja97890 #define	DLD_PROP_NO_SOFTRING	"no-softring"
769c175129Sja97890 
779c175129Sja97890 /*
787c478bd9Sstevel@tonic-gate  * The name of the driver.
797c478bd9Sstevel@tonic-gate  */
807c478bd9Sstevel@tonic-gate #define	DLD_DRIVER_NAME		"dld"
817c478bd9Sstevel@tonic-gate 
827c478bd9Sstevel@tonic-gate /*
837c478bd9Sstevel@tonic-gate  * The name of the control minor node of dld.
847c478bd9Sstevel@tonic-gate  */
857c478bd9Sstevel@tonic-gate #define	DLD_CONTROL_MINOR_NAME	"ctl"
867c478bd9Sstevel@tonic-gate #define	DLD_CONTROL_MINOR	0
877c478bd9Sstevel@tonic-gate #define	DLD_CONTROL_DEV		"/devices/pseudo/" DLD_DRIVER_NAME "@0:" \
887c478bd9Sstevel@tonic-gate 				DLD_CONTROL_MINOR_NAME
897c478bd9Sstevel@tonic-gate 
907c478bd9Sstevel@tonic-gate /*
917c478bd9Sstevel@tonic-gate  * IOCTL codes and data structures.
927c478bd9Sstevel@tonic-gate  */
937c478bd9Sstevel@tonic-gate #define	DLDIOC		('D' << 24 | 'L' << 16 | 'D' << 8)
947c478bd9Sstevel@tonic-gate 
95d62bc4baSyz147064 #define	DLDIOC_ATTR	(DLDIOC | 0x03)
967c478bd9Sstevel@tonic-gate 
97*e7801d59Ssowmini typedef uint32_t		datalink_id_t;
98*e7801d59Ssowmini 
997c478bd9Sstevel@tonic-gate typedef struct dld_ioc_attr {
100d62bc4baSyz147064 	datalink_id_t	dia_linkid;
101210db224Sericheng 	uint_t		dia_max_sdu;
1027c478bd9Sstevel@tonic-gate } dld_ioc_attr_t;
1037c478bd9Sstevel@tonic-gate 
104d62bc4baSyz147064 #define	DLDIOC_VLAN_ATTR	(DLDIOC | 0x04)
105d62bc4baSyz147064 typedef struct dld_ioc_vlan_attr {
106d62bc4baSyz147064 	datalink_id_t	div_vlanid;
107d62bc4baSyz147064 	uint16_t	div_vid;
108d62bc4baSyz147064 	datalink_id_t	div_linkid;
109d62bc4baSyz147064 	boolean_t	div_force;
110d62bc4baSyz147064 	boolean_t	div_implicit;
111d62bc4baSyz147064 } dld_ioc_vlan_attr_t;
112210db224Sericheng 
113d62bc4baSyz147064 #define	DLDIOC_PHYS_ATTR	(DLDIOC | 0x05)
114*e7801d59Ssowmini #define	DLPI_LINKNAME_MAX	32
115*e7801d59Ssowmini 
116d62bc4baSyz147064 typedef struct dld_ioc_phys_attr {
117d62bc4baSyz147064 	datalink_id_t	dip_linkid;
118d62bc4baSyz147064 	/*
119d62bc4baSyz147064 	 * Whether this physical link supports vanity naming. Note that
120d62bc4baSyz147064 	 * physical links whose media type is not supported by GLDv3
121d62bc4baSyz147064 	 * can not support vanity naming.
122d62bc4baSyz147064 	 */
123d62bc4baSyz147064 	boolean_t	dip_novanity;
124d62bc4baSyz147064 	char		dip_dev[MAXLINKNAMELEN];
125d62bc4baSyz147064 } dld_ioc_phys_attr_t;
126f4b3ec61Sdh155122 
1270ba2cbe9Sxc151355 /*
1280ba2cbe9Sxc151355  * Secure objects ioctls
1290ba2cbe9Sxc151355  */
1300ba2cbe9Sxc151355 typedef enum {
131a399b765Szf162725 	DLD_SECOBJ_CLASS_WEP = 1,
132a399b765Szf162725 	DLD_SECOBJ_CLASS_WPA
1330ba2cbe9Sxc151355 } dld_secobj_class_t;
1340ba2cbe9Sxc151355 
1350ba2cbe9Sxc151355 #define	DLD_SECOBJ_OPT_CREATE	0x00000001
1360ba2cbe9Sxc151355 #define	DLD_SECOBJ_NAME_MAX	32
1370ba2cbe9Sxc151355 #define	DLD_SECOBJ_VAL_MAX	256
1380ba2cbe9Sxc151355 typedef struct dld_secobj {
1390ba2cbe9Sxc151355 	char			so_name[DLD_SECOBJ_NAME_MAX];
1400ba2cbe9Sxc151355 	dld_secobj_class_t	so_class;
1410ba2cbe9Sxc151355 	uint8_t			so_val[DLD_SECOBJ_VAL_MAX];
1420ba2cbe9Sxc151355 	uint_t			so_len;
1430ba2cbe9Sxc151355 } dld_secobj_t;
1440ba2cbe9Sxc151355 
145d62bc4baSyz147064 #define	DLDIOC_SECOBJ_SET	(DLDIOC | 0x06)
1460ba2cbe9Sxc151355 typedef struct dld_ioc_secobj_set {
1470ba2cbe9Sxc151355 	dld_secobj_t		ss_obj;
1480ba2cbe9Sxc151355 	uint_t			ss_flags;
1490ba2cbe9Sxc151355 } dld_ioc_secobj_set_t;
1500ba2cbe9Sxc151355 
151d62bc4baSyz147064 #define	DLDIOC_SECOBJ_GET	(DLDIOC | 0x07)
1520ba2cbe9Sxc151355 typedef struct dld_ioc_secobj_get {
1530ba2cbe9Sxc151355 	dld_secobj_t		sg_obj;
1540ba2cbe9Sxc151355 	uint_t			sg_count;
1550ba2cbe9Sxc151355 } dld_ioc_secobj_get_t;
1560ba2cbe9Sxc151355 
157d62bc4baSyz147064 /*
158d62bc4baSyz147064  * The following two slots were used outside of ON, so don't reuse them.
159d62bc4baSyz147064  *
160d62bc4baSyz147064  * #define DLDIOCHOLDVLAN (DLDIOC | 0x08)
161d62bc4baSyz147064  * #define DLDIOCRELEVLAN (DLDIOC | 0x09)
162d62bc4baSyz147064  */
163d62bc4baSyz147064 
164d62bc4baSyz147064 #define	DLDIOC_SECOBJ_UNSET	(DLDIOC | 0x0a)
1650ba2cbe9Sxc151355 typedef struct dld_ioc_secobj_unset {
1660ba2cbe9Sxc151355 	char			su_name[DLD_SECOBJ_NAME_MAX];
1670ba2cbe9Sxc151355 } dld_ioc_secobj_unset_t;
1680ba2cbe9Sxc151355 
169d62bc4baSyz147064 #define	DLDIOC_CREATE_VLAN	(DLDIOC | 0x0b)
170d62bc4baSyz147064 typedef struct dld_ioc_create_vlan {
171d62bc4baSyz147064 	datalink_id_t	dic_vlanid;
172d62bc4baSyz147064 	datalink_id_t	dic_linkid;
173d62bc4baSyz147064 	uint16_t	dic_vid;
174d62bc4baSyz147064 	boolean_t	dic_force;
175d62bc4baSyz147064 } dld_ioc_create_vlan_t;
176d62bc4baSyz147064 
177d62bc4baSyz147064 #define	DLDIOC_DELETE_VLAN	(DLDIOC | 0x0c)
178d62bc4baSyz147064 typedef struct dld_ioc_delete_vlan {
179d62bc4baSyz147064 	datalink_id_t	did_linkid;
180d62bc4baSyz147064 } dld_ioc_delete_vlan_t;
181d62bc4baSyz147064 
182d62bc4baSyz147064 #define	DLDIOC_SETAUTOPUSH	(DLDIOC | 0x0d)
183d62bc4baSyz147064 #define	DLDIOC_GETAUTOPUSH	(DLDIOC | 0x0e)
184d62bc4baSyz147064 #define	DLDIOC_CLRAUTOPUSH	(DLDIOC | 0x0f)
185d62bc4baSyz147064 typedef struct dld_ioc_ap {
186d62bc4baSyz147064 	datalink_id_t	dia_linkid;
187d62bc4baSyz147064 	uint_t  	dia_anchor;
188d62bc4baSyz147064 	uint_t		dia_npush;
189d62bc4baSyz147064 	char		dia_aplist[MAXAPUSH][FMNAMESZ+1];
190d62bc4baSyz147064 } dld_ioc_ap_t;
191d62bc4baSyz147064 
192d62bc4baSyz147064 #define	DLDIOC_DOORSERVER	(DLDIOC | 0x10)
193d62bc4baSyz147064 typedef struct dld_ioc_door {
194d62bc4baSyz147064 	boolean_t	did_start_door;
195d62bc4baSyz147064 } dld_ioc_door_t;
196d62bc4baSyz147064 
197d62bc4baSyz147064 #define	DLDIOC_RENAME		(DLDIOC | 0x11)
198d62bc4baSyz147064 typedef struct dld_ioc_rename {
199d62bc4baSyz147064 	datalink_id_t	dir_linkid1;
200d62bc4baSyz147064 	datalink_id_t	dir_linkid2;
201d62bc4baSyz147064 	char		dir_link[MAXLINKNAMELEN];
202d62bc4baSyz147064 } dld_ioc_rename_t;
203d62bc4baSyz147064 
204f4b3ec61Sdh155122 /*
205d62bc4baSyz147064  * DLDIOC_SETZID sets the zoneid of a given link. It could cause a VLAN to be
206d62bc4baSyz147064  * implicitly created.  Note that we will hold a reference for the given link
207d62bc4baSyz147064  * whenever it has a zoneid other than the global zone.
208f4b3ec61Sdh155122  */
209d62bc4baSyz147064 #define	DLDIOC_SETZID		(DLDIOC | 0x12)
210d62bc4baSyz147064 typedef struct dld_ioc_setzid {
211d62bc4baSyz147064 	char		dis_link[MAXLINKNAMELEN];
212d62bc4baSyz147064 	zoneid_t	dis_zid;
213d62bc4baSyz147064 } dld_ioc_setzid_t;
214f4b3ec61Sdh155122 
215d62bc4baSyz147064 #define	DLDIOC_GETZID  		(DLDIOC | 0x13)
216d62bc4baSyz147064 typedef struct dld_ioc_getzid {
217d62bc4baSyz147064 	datalink_id_t	dig_linkid;
218d62bc4baSyz147064 	zoneid_t	dig_zid;
219d62bc4baSyz147064 } dld_ioc_getzid_t;
220f4b3ec61Sdh155122 
221d62bc4baSyz147064 /*
222d62bc4baSyz147064  * data-link autopush configuration.
223d62bc4baSyz147064  */
224d62bc4baSyz147064 struct dlautopush {
225d62bc4baSyz147064 	uint_t	dap_anchor;
226d62bc4baSyz147064 	uint_t	dap_npush;
227d62bc4baSyz147064 	char	dap_aplist[MAXAPUSH][FMNAMESZ+1];
228d62bc4baSyz147064 };
229f4b3ec61Sdh155122 
230*e7801d59Ssowmini /*
231*e7801d59Ssowmini  * Encodings for public properties.
232*e7801d59Ssowmini  * A most significant bit value of 1 indicates private property, intended
233*e7801d59Ssowmini  * to allow private property implementations to use internal encodings
234*e7801d59Ssowmini  * if desired.
235*e7801d59Ssowmini  *
236*e7801d59Ssowmini  * Note that there are 2 sets of parameters: the *_EN_*
237*e7801d59Ssowmini  * values are those that the Administrator configures for autonegotiation.
238*e7801d59Ssowmini  * The _ADV_* values are those that are currently exposed over the wire.
239*e7801d59Ssowmini  */
240*e7801d59Ssowmini typedef enum {
241*e7801d59Ssowmini 	DLD_PROP_DUPLEX = 0x00000001,
242*e7801d59Ssowmini 	DLD_PROP_SPEED,
243*e7801d59Ssowmini 	DLD_PROP_STATUS,
244*e7801d59Ssowmini 	DLD_PROP_AUTONEG,
245*e7801d59Ssowmini 	DLD_PROP_EN_AUTONEG,
246*e7801d59Ssowmini 	DLD_PROP_DEFMTU,
247*e7801d59Ssowmini 	DLD_PROP_NDD_LEGACY,
248*e7801d59Ssowmini 	DLD_PROP_FLOWCTRL,
249*e7801d59Ssowmini 	DLD_PROP_ADV_1000FDX_CAP,
250*e7801d59Ssowmini 	DLD_PROP_EN_1000FDX_CAP,
251*e7801d59Ssowmini 	DLD_PROP_ADV_1000HDX_CAP,
252*e7801d59Ssowmini 	DLD_PROP_EN_1000HDX_CAP,
253*e7801d59Ssowmini 	DLD_PROP_ADV_100FDX_CAP,
254*e7801d59Ssowmini 	DLD_PROP_EN_100FDX_CAP,
255*e7801d59Ssowmini 	DLD_PROP_ADV_100HDX_CAP,
256*e7801d59Ssowmini 	DLD_PROP_EN_100HDX_CAP,
257*e7801d59Ssowmini 	DLD_PROP_ADV_10FDX_CAP,
258*e7801d59Ssowmini 	DLD_PROP_EN_10FDX_CAP,
259*e7801d59Ssowmini 	DLD_PROP_ADV_10HDX_CAP,
260*e7801d59Ssowmini 	DLD_PROP_EN_10HDX_CAP,
261*e7801d59Ssowmini 	DLD_PROP_PRIVATE = -1
262*e7801d59Ssowmini } dld_prop_id_t;
263*e7801d59Ssowmini 
264*e7801d59Ssowmini /*
265*e7801d59Ssowmini  * to figure out r/w status of legacy ndd props.
266*e7801d59Ssowmini  */
267*e7801d59Ssowmini #define	DLD_NDD_READ		0x01
268*e7801d59Ssowmini #define	DLD_NDD_WRITE		0x10
269*e7801d59Ssowmini 
270*e7801d59Ssowmini #define	DLDIOCSETPROP		(DLDIOC | 0x14)
271*e7801d59Ssowmini #define	DLDIOCGETPROP		(DLDIOC | 0x15)
272*e7801d59Ssowmini #define	DLD_LINKPROP_NAME_MAX	256
273*e7801d59Ssowmini #define	DLD_PROP_VERSION	1
274*e7801d59Ssowmini 
275*e7801d59Ssowmini typedef struct dld_ioc_prop_s {
276*e7801d59Ssowmini 	int		pr_version;
277*e7801d59Ssowmini 	uint_t		pr_flags;		/* private to libdladm */
278*e7801d59Ssowmini 	char		pr_linkname[DLPI_LINKNAME_MAX];	/* interface name */
279*e7801d59Ssowmini 	dld_prop_id_t	pr_num;
280*e7801d59Ssowmini 	char    	pr_name[DLD_LINKPROP_NAME_MAX];
281*e7801d59Ssowmini 	uint_t		pr_valsize;		/* sizeof pr_val */
282*e7801d59Ssowmini 	char		pr_val[1];
283*e7801d59Ssowmini } dld_ioc_prop_t;
284*e7801d59Ssowmini 
285210db224Sericheng #ifdef _KERNEL
286*e7801d59Ssowmini typedef	dld_prop_id_t	mac_prop_id_t;
287210db224Sericheng int	dld_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
288210db224Sericheng int	dld_open(queue_t *, dev_t *, int, int, cred_t *);
289210db224Sericheng int	dld_close(queue_t *);
290210db224Sericheng void	dld_wput(queue_t *, mblk_t *);
291210db224Sericheng void	dld_wsrv(queue_t *);
292210db224Sericheng void	dld_init_ops(struct dev_ops *, const char *);
293210db224Sericheng void	dld_fini_ops(struct dev_ops *);
294d62bc4baSyz147064 int	dld_autopush(dev_t *, struct dlautopush *);
295210db224Sericheng #endif
296210db224Sericheng 
2977c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2987c478bd9Sstevel@tonic-gate }
2997c478bd9Sstevel@tonic-gate #endif
3007c478bd9Sstevel@tonic-gate 
3017c478bd9Sstevel@tonic-gate #endif	/* _SYS_DLD_H */
302