xref: /illumos-gate/usr/src/lib/libdlpi/common/libdlpi_impl.h (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_LIBDLPI_IMPL_H
27 #define	_LIBDLPI_IMPL_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #include <libdlpi.h>
32 #include <sys/sysmacros.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 /*
39  * Maximum DLPI response size, in bytes.
40  */
41 #define	DLPI_CHUNKSIZE	8192
42 
43 /*
44  * Maximum SAP length, in bytes.
45  */
46 #define	DLPI_SAPLEN_MAX	4
47 
48 /*
49  * Maximum number of modules that can be pushed onto a device stream.
50  */
51 #define	DLPI_MODS_MAX	9
52 
53 /*
54  * Number of elements in 'arr'.
55  */
56 #define	NELEMS(arr)	(sizeof (arr) / sizeof ((arr)[0]))
57 
58 /*
59  * Allocate buffer size for DLPI message, in bytes and set DLPI primitive.
60  */
61 #define	DLPI_MSG_CREATE(dlmsg, dlprimitive) \
62 	(dlmsg).dlm_msgsz = i_dlpi_getprimsize((dlprimitive)); \
63 	(dlmsg).dlm_msg = alloca((dlmsg).dlm_msgsz); \
64 	(dlmsg).dlm_msg->dl_primitive = (dlprimitive);
65 
66 /*
67  * Publicly available DLPI notification types. This list may change if
68  * new DLPI notification types are made public. See dlpi(7P).
69  *
70  */
71 #define	DLPI_NOTIFICATION_TYPES	(DL_NOTE_LINK_DOWN | DL_NOTE_LINK_UP | \
72 	DL_NOTE_PHYS_ADDR | DL_NOTE_SDU_SIZE | DL_NOTE_SPEED | \
73 	DL_NOTE_PROMISC_ON_PHYS | DL_NOTE_PROMISC_OFF_PHYS)
74 
75 /*
76  * Used in a mactype lookup table.
77  */
78 typedef struct dlpi_mactype_s {
79 	uint_t	dm_mactype;	/* DLPI/Private mactype */
80 	char 	*dm_desc;	/* Description of mactype */
81 } dlpi_mactype_t;
82 
83 /*
84  * Used to get the maximum DLPI message buffer size, in bytes.
85  */
86 typedef struct dlpi_primsz {
87 	t_uscalar_t	dp_prim;	/* store DLPI primitive */
88 	size_t		dp_primsz;
89 				/* max. message size, in bytes, for dp_prim */
90 } dlpi_primsz_t;
91 
92 /*
93  * Used to create DLPI message.
94  */
95 typedef struct dlpi_msg {
96 	union DL_primitives	*dlm_msg;
97 					/* store DLPI primitive message */
98 	size_t			dlm_msgsz;
99 					/* provide buffer size for dlm_msg */
100 } dlpi_msg_t;
101 
102 typedef struct dlpi_notifyent {
103 	uint_t			dln_notes;
104 					/* notification types registered */
105 	dlpi_notifyfunc_t	*dln_fnp;
106 					/* callback to call */
107 	void 			*arg;	/* argument to pass to callback */
108 	uint_t			dln_rm;	/* true if should be removed */
109 	struct dlpi_notifyent	*dln_next;
110 } dlpi_notifyent_t;
111 
112 /*
113  * Private libdlpi structure associated with each DLPI handle.
114  */
115 typedef struct dlpi_impl_s {
116 	int		dli_fd;		/* fd attached to stream */
117 	int		dli_timeout;	/* timeout for operations, in sec */
118 	char		dli_linkname[DLPI_LINKNAME_MAX];
119 					/* full linkname including PPA */
120 	char		dli_provider[DLPI_LINKNAME_MAX];
121 					/* only provider name */
122 	t_uscalar_t	dli_style;	/* style 1 or 2 */
123 	uint_t		dli_saplen;	/* bound SAP length */
124 	uint_t		dli_sap;	/* bound SAP value */
125 	boolean_t 	dli_sapbefore;	/* true if SAP precedes address */
126 	uint_t		dli_ppa;	/* physical point of attachment */
127 	uint_t		dli_mod_cnt;	/* number of modules to be pushed */
128 	uint_t		dli_mod_pushed;	/* number of modules pushed */
129 	char   		dli_modlist[DLPI_MODS_MAX][DLPI_LINKNAME_MAX];
130 					/* array of mods */
131 	uint_t		dli_mactype;	/* mac type */
132 	uint_t		dli_oflags;	/* flags set at open */
133 	uint_t		dli_note_processing;
134 					/* true if notification is being */
135 					/* processed */
136 	dlpi_notifyent_t *dli_notifylistp;
137 					/* list of registered notifications */
138 } dlpi_impl_t;
139 
140 #ifdef __cplusplus
141 }
142 #endif
143 
144 #endif /* _LIBDLPI_IMPL_H */
145