xref: /titanic_44/usr/src/uts/common/sys/dlpi.h (revision 8eea8e29cc4374d1ee24c25a07f45af132db3499)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved	*/
29 
30 
31 /*
32  * Data Link Provider Interface, Version 2.0
33  * Refer to document: "STREAMS DLPI Spec", 800-6915-01.
34  */
35 
36 #ifndef	_SYS_DLPI_H
37 #define	_SYS_DLPI_H
38 
39 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.2	*/
40 
41 #include <sys/types.h>
42 #include <sys/stream.h>
43 
44 #ifdef	__cplusplus
45 extern "C" {
46 #endif
47 
48 /*
49  * Sun additions.
50  */
51 #define	DLIOC		('D' << 8)
52 #define	DLIOCRAW	(DLIOC|1)	/* M_DATA "raw" mode */
53 #define	DLIOCHDRINFO	(DLIOC|10)	/* IP fast-path */
54 
55 #define	DL_IOC_HDR_INFO	DLIOCHDRINFO
56 
57 /*
58  * DLPI revision definition history
59  */
60 #define	DL_CURRENT_VERSION	0x02	/* current version of dlpi */
61 #define	DL_VERSION_2		0x02	/* version of dlpi March 12, 1991 */
62 
63 /*
64  * Primitives for Local Management Services
65  */
66 #define	DL_INFO_REQ		0x00	/* Information Req */
67 #define	DL_INFO_ACK		0x03	/* Information Ack */
68 #define	DL_ATTACH_REQ		0x0b	/* Attach a PPA */
69 #define	DL_DETACH_REQ		0x0c	/* Detach a PPA */
70 #define	DL_BIND_REQ		0x01	/* Bind dlsap address */
71 #define	DL_BIND_ACK		0x04	/* Dlsap address bound */
72 #define	DL_UNBIND_REQ		0x02	/* Unbind dlsap address */
73 #define	DL_OK_ACK		0x06	/* Success acknowledgment */
74 #define	DL_ERROR_ACK		0x05	/* Error acknowledgment */
75 #define	DL_SUBS_BIND_REQ	0x1b	/* Bind Subsequent DLSAP address */
76 #define	DL_SUBS_BIND_ACK	0x1c	/* Subsequent DLSAP address bound */
77 #define	DL_SUBS_UNBIND_REQ	0x15	/* Subsequent unbind */
78 #define	DL_ENABMULTI_REQ	0x1d	/* Enable multicast addresses */
79 #define	DL_DISABMULTI_REQ	0x1e	/* Disable multicast addresses */
80 #define	DL_PROMISCON_REQ	0x1f	/* Turn on promiscuous mode */
81 #define	DL_PROMISCOFF_REQ	0x20	/* Turn off promiscuous mode */
82 
83 /*
84  * Solaris specific local management
85  */
86 #define	DL_NOTIFY_REQ		0x100	/* Enable notifications */
87 #define	DL_NOTIFY_ACK		0x101	/* Supported notifications */
88 #define	DL_NOTIFY_IND		0x102	/* Notification from provider */
89 #define	DL_AGGR_REQ		0x103	/* Enable link aggregation */
90 #define	DL_AGGR_IND		0x104	/* Result from link aggregation */
91 #define	DL_UNAGGR_REQ		0x105	/* Disable link aggregation */
92 #define	DL_CAPABILITY_REQ	0x110	/* Capability request */
93 #define	DL_CAPABILITY_ACK	0x111	/* Capability ack */
94 #define	DL_CONTROL_REQ		0x112	/* Device specific control request */
95 #define	DL_CONTROL_ACK		0x113	/* Device specific control ack */
96 #define	DL_PASSIVE_REQ		0x114	/* Allow access to aggregated link */
97 
98 
99 /*
100  * Primitives used for Connectionless Service
101  */
102 #define	DL_UNITDATA_REQ		0x07	/* datagram send request */
103 #define	DL_UNITDATA_IND		0x08	/* datagram receive indication */
104 #define	DL_UDERROR_IND		0x09	/* datagram error indication */
105 #define	DL_UDQOS_REQ		0x0a	/* set QOS for subsequent datagrams */
106 
107 /*
108  * Primitives used for Connection-Oriented Service
109  */
110 #define	DL_CONNECT_REQ		0x0d	/* Connect request */
111 #define	DL_CONNECT_IND		0x0e	/* Incoming connect indication */
112 #define	DL_CONNECT_RES		0x0f	/* Accept previous connect indication */
113 #define	DL_CONNECT_CON		0x10	/* Connection established */
114 
115 #define	DL_TOKEN_REQ		0x11	/* Passoff token request */
116 #define	DL_TOKEN_ACK		0x12	/* Passoff token ack */
117 
118 #define	DL_DISCONNECT_REQ	0x13	/* Disconnect request */
119 #define	DL_DISCONNECT_IND	0x14	/* Disconnect indication */
120 
121 #define	DL_RESET_REQ		0x17	/* Reset service request */
122 #define	DL_RESET_IND		0x18	/* Incoming reset indication */
123 #define	DL_RESET_RES		0x19	/* Complete reset processing */
124 #define	DL_RESET_CON		0x1a	/* Reset processing complete */
125 
126 /*
127  *  Primitives used for Acknowledged Connectionless Service
128  */
129 
130 #define	DL_DATA_ACK_REQ		0x21	/* data unit transmission request */
131 #define	DL_DATA_ACK_IND		0x22	/* Arrival of a command PDU */
132 #define	DL_DATA_ACK_STATUS_IND	0x23	/* Status indication of DATA_ACK_REQ */
133 #define	DL_REPLY_REQ		0x24	/* Request a DLSDU from the remote */
134 #define	DL_REPLY_IND		0x25	/* Arrival of a command PDU */
135 #define	DL_REPLY_STATUS_IND	0x26	/* Status indication of REPLY_REQ */
136 #define	DL_REPLY_UPDATE_REQ	0x27	/* Hold a DLSDU for transmission */
137 #define	DL_REPLY_UPDATE_STATUS_IND	0x28 /* Status of REPLY_UPDATE req */
138 
139 /*
140  * Primitives used for XID and TEST operations
141  */
142 
143 #define	DL_XID_REQ	0x29		/* Request to send an XID PDU */
144 #define	DL_XID_IND	0x2a		/* Arrival of an XID PDU */
145 #define	DL_XID_RES	0x2b		/* request to send a response XID PDU */
146 #define	DL_XID_CON	0x2c		/* Arrival of a response XID PDU */
147 #define	DL_TEST_REQ	0x2d		/* TEST command request */
148 #define	DL_TEST_IND	0x2e		/* TEST response indication */
149 #define	DL_TEST_RES	0x2f		/* TEST response */
150 #define	DL_TEST_CON	0x30		/* TEST Confirmation */
151 
152 /*
153  * Primitives to get and set the physical address, and to get
154  * Statistics
155  */
156 
157 #define	DL_PHYS_ADDR_REQ	0x31	/* Request to get physical addr */
158 #define	DL_PHYS_ADDR_ACK	0x32	/* Return physical addr */
159 #define	DL_SET_PHYS_ADDR_REQ	0x33	/* set physical addr */
160 #define	DL_GET_STATISTICS_REQ	0x34	/* Request to get statistics */
161 #define	DL_GET_STATISTICS_ACK	0x35	/* Return statistics */
162 
163 /*
164  * Invalid primitive
165  */
166 
167 #define	DL_PRIM_INVAL		0xffff	/* Invalid DL primitive value */
168 
169 /*
170  * DLPI interface states
171  */
172 #define	DL_UNATTACHED		0x04	/* PPA not attached */
173 #define	DL_ATTACH_PENDING	0x05	/* Waiting ack of DL_ATTACH_REQ */
174 #define	DL_DETACH_PENDING	0x06	/* Waiting ack of DL_DETACH_REQ */
175 #define	DL_UNBOUND		0x00	/* PPA attached */
176 #define	DL_BIND_PENDING		0x01	/* Waiting ack of DL_BIND_REQ */
177 #define	DL_UNBIND_PENDING	0x02	/* Waiting ack of DL_UNBIND_REQ */
178 #define	DL_IDLE			0x03	/* dlsap bound, awaiting use */
179 #define	DL_UDQOS_PENDING	0x07	/* Waiting ack of DL_UDQOS_REQ */
180 #define	DL_OUTCON_PENDING	0x08	/* awaiting DL_CONN_CON */
181 #define	DL_INCON_PENDING	0x09	/* awaiting DL_CONN_RES */
182 #define	DL_CONN_RES_PENDING	0x0a	/* Waiting ack of DL_CONNECT_RES */
183 #define	DL_DATAXFER		0x0b	/* connection-oriented data transfer */
184 #define	DL_USER_RESET_PENDING	0x0c	/* awaiting DL_RESET_CON */
185 #define	DL_PROV_RESET_PENDING	0x0d	/* awaiting DL_RESET_RES */
186 #define	DL_RESET_RES_PENDING	0x0e	/* Waiting ack of DL_RESET_RES */
187 #define	DL_DISCON8_PENDING	0x0f	/* Waiting ack of DL_DISC_REQ */
188 #define	DL_DISCON9_PENDING	0x10	/* Waiting ack of DL_DISC_REQ */
189 #define	DL_DISCON11_PENDING	0x11	/* Waiting ack of DL_DISC_REQ */
190 #define	DL_DISCON12_PENDING	0x12	/* Waiting ack of DL_DISC_REQ */
191 #define	DL_DISCON13_PENDING	0x13	/* Waiting ack of DL_DISC_REQ */
192 #define	DL_SUBS_BIND_PND	0x14	/* Waiting ack of DL_SUBS_BIND_REQ */
193 #define	DL_SUBS_UNBIND_PND	0x15	/* Waiting ack of DL_SUBS_UNBIND_REQ */
194 
195 
196 /*
197  * DL_ERROR_ACK error return values
198  */
199 #define	DL_ACCESS	0x02	/* Improper permissions for request */
200 #define	DL_BADADDR	0x01	/* DLSAP addr in improper format or invalid */
201 #define	DL_BADCORR	0x05	/* Seq number not from outstand DL_CONN_IND */
202 #define	DL_BADDATA	0x06	/* User data exceeded provider limit */
203 #define	DL_BADPPA	0x08	/* Specified PPA was invalid */
204 #define	DL_BADPRIM	0x09	/* Primitive received not known by provider */
205 #define	DL_BADQOSPARAM	0x0a	/* QOS parameters contained invalid values */
206 #define	DL_BADQOSTYPE	0x0b	/* QOS structure type is unknown/unsupported */
207 #define	DL_BADSAP	0x00	/* Bad LSAP selector */
208 #define	DL_BADTOKEN	0x0c	/* Token used not an active stream */
209 #define	DL_BOUND	0x0d	/* Attempted second bind with dl_max_conind */
210 #define	DL_INITFAILED	0x0e	/* Physical Link initialization failed */
211 #define	DL_NOADDR	0x0f	/* Provider couldn't allocate alt. address */
212 #define	DL_NOTINIT	0x10	/* Physical Link not initialized */
213 #define	DL_OUTSTATE	0x03	/* Primitive issued in improper state */
214 #define	DL_SYSERR	0x04	/* UNIX system error occurred */
215 #define	DL_UNSUPPORTED	0x07	/* Requested serv. not supplied by provider */
216 #define	DL_UNDELIVERABLE 0x11	/* Previous data unit could not be delivered */
217 #define	DL_NOTSUPPORTED  0x12	/* Primitive is known but not supported */
218 #define	DL_TOOMANY	0x13	/* limit exceeded	*/
219 #define	DL_NOTENAB	0x14	/* Promiscuous mode not enabled */
220 #define	DL_BUSY		0x15	/* Other streams for PPA in post-attached */
221 
222 #define	DL_NOAUTO	0x16	/* Automatic handling XID&TEST not supported */
223 #define	DL_NOXIDAUTO	0x17    /* Automatic handling of XID not supported */
224 #define	DL_NOTESTAUTO	0x18	/* Automatic handling of TEST not supported */
225 #define	DL_XIDAUTO	0x19	/* Automatic handling of XID response */
226 #define	DL_TESTAUTO	0x1a	/* AUtomatic handling of TEST response */
227 #define	DL_PENDING	0x1b	/* pending outstanding connect indications */
228 
229 /*
230  * DLPI media types supported
231  */
232 #define	DL_CSMACD	0x0	/* IEEE 802.3 CSMA/CD network */
233 #define	DL_TPB		0x1	/* IEEE 802.4 Token Passing Bus */
234 #define	DL_TPR		0x2	/* IEEE 802.5 Token Passing Ring */
235 #define	DL_METRO	0x3	/* IEEE 802.6 Metro Net */
236 #define	DL_ETHER	0x4	/* Ethernet Bus */
237 #define	DL_HDLC		0x05	/* ISO HDLC protocol support */
238 #define	DL_CHAR		0x06	/* Character Synchronous protocol support */
239 #define	DL_CTCA		0x07	/* IBM Channel-to-Channel Adapter */
240 #define	DL_FDDI		0x08	/* Fiber Distributed data interface */
241 #define	DL_FC		0x10	/* Fibre Channel interface */
242 #define	DL_ATM		0x11	/* ATM */
243 #define	DL_IPATM	0x12	/* ATM Classical IP interface */
244 #define	DL_X25		0x13	/* X.25 LAPB interface */
245 #define	DL_ISDN		0x14	/* ISDN interface */
246 #define	DL_HIPPI	0x15	/* HIPPI interface */
247 #define	DL_100VG	0x16	/* 100 Based VG Ethernet */
248 #define	DL_100VGTPR	0x17	/* 100 Based VG Token Ring */
249 #define	DL_ETH_CSMA	0x18	/* ISO 8802/3 and Ethernet */
250 #define	DL_100BT	0x19	/* 100 Base T */
251 #define	DL_IB		0x1a	/* Infiniband */
252 #define	DL_FRAME	0x0a	/* Frame Relay LAPF */
253 #define	DL_MPFRAME	0x0b	/* Multi-protocol over Frame Relay */
254 #define	DL_ASYNC	0x0c	/* Character Asynchronous Protocol */
255 #define	DL_IPX25	0x0d	/* X.25 Classical IP interface */
256 #define	DL_LOOP		0x0e	/* software loopback */
257 #define	DL_OTHER	0x09	/* Any other medium not listed above */
258 /*
259  * Private media types.  These must be above the value 0x80000000 as
260  * stated in the DLPI specification.
261  */
262 #define	DL_IPV4		0x80000001ul	/* IPv4 Tunnel Link */
263 #define	DL_IPV6		0x80000002ul	/* IPv6 Tunnel Link */
264 #define	SUNW_DL_VNI	0x80000003ul	/* Virtual network interface */
265 
266 /*
267  * DLPI provider service supported.
268  * These must be allowed to be bitwise-OR for dl_service_mode in
269  * DL_INFO_ACK.
270  */
271 #define	DL_CODLS	0x01	/* support connection-oriented service */
272 #define	DL_CLDLS	0x02	/* support connectionless data link service */
273 #define	DL_ACLDLS	0x04	/* support acknowledged connectionless serv. */
274 
275 
276 /*
277  * DLPI provider style.
278  * The DLPI provider style which determines whether a provider
279  * requires a DL_ATTACH_REQ to inform the provider which PPA
280  * user messages should be sent/received on.
281  */
282 #define	DL_STYLE1	0x0500	/* PPA is implicitly bound by open(2) */
283 #define	DL_STYLE2	0x0501	/* PPA must be expl. bound via DL_ATTACH_REQ */
284 
285 
286 /*
287  * DLPI Originator for Disconnect and Resets
288  */
289 #define	DL_PROVIDER	0x0700
290 #define	DL_USER		0x0701
291 
292 /*
293  * DLPI Disconnect Reasons
294  */
295 #define	DL_CONREJ_DEST_UNKNOWN			0x0800
296 #define	DL_CONREJ_DEST_UNREACH_PERMANENT	0x0801
297 #define	DL_CONREJ_DEST_UNREACH_TRANSIENT	0x0802
298 #define	DL_CONREJ_QOS_UNAVAIL_PERMANENT		0x0803
299 #define	DL_CONREJ_QOS_UNAVAIL_TRANSIENT		0x0804
300 #define	DL_CONREJ_PERMANENT_COND		0x0805
301 #define	DL_CONREJ_TRANSIENT_COND		0x0806
302 #define	DL_DISC_ABNORMAL_CONDITION		0x0807
303 #define	DL_DISC_NORMAL_CONDITION		0x0808
304 #define	DL_DISC_PERMANENT_CONDITION		0x0809
305 #define	DL_DISC_TRANSIENT_CONDITION		0x080a
306 #define	DL_DISC_UNSPECIFIED			0x080b
307 
308 /*
309  * DLPI Reset Reasons
310  */
311 #define	DL_RESET_FLOW_CONTROL	0x0900
312 #define	DL_RESET_LINK_ERROR	0x0901
313 #define	DL_RESET_RESYNCH	0x0902
314 
315 /*
316  * DLPI status values for acknowledged connectionless data transfer
317  */
318 #define	DL_CMD_MASK	0x0f	/* mask for command portion of status */
319 #define	DL_CMD_OK	0x00	/* Command Accepted */
320 #define	DL_CMD_RS	0x01	/* Unimplemented or inactivated service */
321 #define	DL_CMD_UE	0x05	/* Data Link User interface error */
322 #define	DL_CMD_PE	0x06	/* Protocol error */
323 #define	DL_CMD_IP	0x07	/* Permanent implementation dependent error */
324 #define	DL_CMD_UN	0x09	/* Resources temporarily unavailable */
325 #define	DL_CMD_IT	0x0f	/* Temporary implementation dependent error */
326 #define	DL_RSP_MASK	0xf0	/* mask for response portion of status */
327 #define	DL_RSP_OK	0x00	/* Response DLSDU present */
328 #define	DL_RSP_RS	0x10	/* Unimplemented or inactivated service */
329 #define	DL_RSP_NE	0x30	/* Response DLSDU never submitted */
330 #define	DL_RSP_NR	0x40	/* Response DLSDU not requested */
331 #define	DL_RSP_UE	0x50	/* Data Link User interface error */
332 #define	DL_RSP_IP	0x70	/* Permanent implementation dependent error */
333 #define	DL_RSP_UN	0x90	/* Resources temporarily unavailable */
334 #define	DL_RSP_IT	0xf0	/* Temporary implementation dependent error */
335 
336 /*
337  * Service Class values for acknowledged connectionless data transfer
338  */
339 #define	DL_RQST_RSP	0x01	/* Use acknowledge capability in MAC sublayer */
340 #define	DL_RQST_NORSP	0x02	/* No acknowledgement service requested */
341 
342 /*
343  * DLPI address type definition
344  */
345 #define	DL_FACT_PHYS_ADDR	0x01	/* factory physical address */
346 #define	DL_CURR_PHYS_ADDR	0x02	/* current physical address */
347 #define	DL_IPV6_TOKEN		0x03	/* IPv6 interface token */
348 #define	DL_IPV6_LINK_LAYER_ADDR	0x04	/* Neighbor Discovery format */
349 
350 /*
351  * DLPI flag definitions
352  */
353 #define	DL_POLL_FINAL	0x01		/* indicates poll/final bit set */
354 
355 /*
356  *	XID and TEST responses supported by the provider
357  */
358 #define	DL_AUTO_XID	0x01		/* provider will respond to XID */
359 #define	DL_AUTO_TEST	0x02		/* provider will respond to TEST */
360 
361 /*
362  * Subsequent bind type
363  */
364 #define	DL_PEER_BIND	0x01		/* subsequent bind on a peer addr */
365 #define	DL_HIERARCHICAL_BIND	0x02	/* subs_bind on a hierarchical addr */
366 
367 /*
368  * DLPI promiscuous mode definitions
369  */
370 #define	DL_PROMISC_PHYS		0x01	/* promiscuous mode at phys level */
371 #define	DL_PROMISC_SAP		0x02	/* promiscous mode at sap level */
372 #define	DL_PROMISC_MULTI	0x03	/* promiscuous mode for multicast */
373 
374 /*
375  * DLPI notification codes for DL_NOTIFY primitives.
376  * Bit-wise distinct since DL_NOTIFY_REQ and DL_NOTIFY_ACK carry multiple
377  * notification codes.
378  */
379 #define	DL_NOTE_PHYS_ADDR	0x0001	/* Physical address change */
380 #define	DL_NOTE_PROMISC_ON_PHYS	0x0002	/* DL_PROMISC_PHYS set on ppa */
381 #define	DL_NOTE_PROMISC_OFF_PHYS 0x0004	/* DL_PROMISC_PHYS cleared on ppa */
382 #define	DL_NOTE_LINK_DOWN	0x0008	/* Link down */
383 #define	DL_NOTE_LINK_UP		0x0010	/* Link up */
384 #define	DL_NOTE_AGGR_AVAIL	0x0020	/* Link aggregation is available */
385 #define	DL_NOTE_AGGR_UNAVAIL	0x0040	/* Link aggregation is not available */
386 #define	DL_NOTE_SDU_SIZE	0x0080	/* New SDU size, global or per addr */
387 #define	DL_NOTE_SPEED		0x0100	/* Approximate link speed */
388 #define	DL_NOTE_FASTPATH_FLUSH	0x0200	/* Fast Path info changes */
389 #define	DL_NOTE_CAPAB_RENEG	0x0400	/* Initiate capability renegotiation */
390 
391 /*
392  * DLPI Quality Of Service definition for use in QOS structure definitions.
393  * The QOS structures are used in connection establishment, DL_INFO_ACK,
394  * and setting connectionless QOS values.
395  */
396 
397 /*
398  * Throughput
399  *
400  * This parameter is specified for both directions.
401  */
402 typedef struct {
403 	t_scalar_t	dl_target_value;	/* bits/second desired */
404 	t_scalar_t	dl_accept_value;	/* min. ok bits/second */
405 } dl_through_t;
406 
407 /*
408  * transit delay specification
409  *
410  * This parameter is specified for both directions.
411  * expressed in milliseconds assuming a DLSDU size of 128 octets.
412  * The scaling of the value to the current DLSDU size is provider dependent.
413  */
414 typedef struct {
415 	t_scalar_t	dl_target_value;	/* desired value of service */
416 	t_scalar_t	dl_accept_value;	/* min. ok value of service */
417 } dl_transdelay_t;
418 
419 /*
420  * priority specification
421  * priority range is 0-100, with 0 being highest value.
422  */
423 typedef struct {
424 	t_scalar_t	dl_min;
425 	t_scalar_t	dl_max;
426 } dl_priority_t;
427 
428 
429 /*
430  * protection specification
431  *
432  */
433 #define	DL_NONE			0x0B01	/* no protection supplied */
434 #define	DL_MONITOR		0x0B02	/* prot. from passive monit. */
435 #define	DL_MAXIMUM		0x0B03	/* prot. from modification, replay, */
436 					/* addition, or deletion */
437 
438 typedef struct {
439 	t_scalar_t	dl_min;
440 	t_scalar_t	dl_max;
441 } dl_protect_t;
442 
443 
444 /*
445  * Resilience specification
446  * probabilities are scaled by a factor of 10,000 with a time interval
447  * of 10,000 seconds.
448  */
449 typedef struct {
450 	t_scalar_t	dl_disc_prob;	/* prob. of provider init DISC */
451 	t_scalar_t	dl_reset_prob;	/* prob. of provider init RESET */
452 } dl_resilience_t;
453 
454 
455 /*
456  * QOS type definition to be used for negotiation with the
457  * remote end of a connection, or a connectionless unitdata request.
458  * There are two type definitions to handle the negotiation
459  * process at connection establishment. The typedef dl_qos_range_t
460  * is used to present a range for parameters. This is used
461  * in the DL_CONNECT_REQ and DL_CONNECT_IND messages. The typedef
462  * dl_qos_sel_t is used to select a specific value for the QOS
463  * parameters. This is used in the DL_CONNECT_RES, DL_CONNECT_CON,
464  * and DL_INFO_ACK messages to define the selected QOS parameters
465  * for a connection.
466  *
467  * NOTE
468  *	A DataLink provider which has unknown values for any of the fields
469  *	will use a value of DL_UNKNOWN for all values in the fields.
470  *
471  * NOTE
472  *	A QOS parameter value of DL_QOS_DONT_CARE informs the DLS
473  *	provider the user requesting this value doesn't care
474  *	what the QOS parameter is set to. This value becomes the
475  *	least possible value in the range of QOS parameters.
476  *	The order of the QOS parameter range is then:
477  *
478  *		DL_QOS_DONT_CARE < 0 < MAXIMUM QOS VALUE
479  */
480 #define	DL_UNKNOWN		-1
481 #define	DL_QOS_DONT_CARE	-2
482 
483 /*
484  * Every QOS structure has the first 4 bytes containing a type
485  * field, denoting the definition of the rest of the structure.
486  * This is used in the same manner has the dl_primitive variable
487  * is in messages.
488  *
489  * The following list is the defined QOS structure type values and structures.
490  */
491 #define	DL_QOS_CO_RANGE1	0x0101	/* CO QOS range struct. */
492 #define	DL_QOS_CO_SEL1		0x0102	/* CO QOS selection structure */
493 #define	DL_QOS_CL_RANGE1	0x0103	/* CL QOS range struct. */
494 #define	DL_QOS_CL_SEL1		0x0104	/* CL QOS selection */
495 
496 typedef struct {
497 	t_uscalar_t	dl_qos_type;
498 	dl_through_t	dl_rcv_throughput;	/* desired and accep. */
499 	dl_transdelay_t	dl_rcv_trans_delay;	/* desired and accep. */
500 	dl_through_t	dl_xmt_throughput;
501 	dl_transdelay_t	dl_xmt_trans_delay;
502 	dl_priority_t	dl_priority;		/* min and max values */
503 	dl_protect_t	dl_protection;		/* min and max values */
504 	t_scalar_t	dl_residual_error;
505 	dl_resilience_t	dl_resilience;
506 }	dl_qos_co_range1_t;
507 
508 typedef struct {
509 	t_uscalar_t	dl_qos_type;
510 	t_scalar_t	dl_rcv_throughput;
511 	t_scalar_t	dl_rcv_trans_delay;
512 	t_scalar_t	dl_xmt_throughput;
513 	t_scalar_t	dl_xmt_trans_delay;
514 	t_scalar_t	dl_priority;
515 	t_scalar_t	dl_protection;
516 	t_scalar_t	dl_residual_error;
517 	dl_resilience_t	dl_resilience;
518 }	dl_qos_co_sel1_t;
519 
520 typedef struct {
521 	t_uscalar_t	dl_qos_type;
522 	dl_transdelay_t	dl_trans_delay;
523 	dl_priority_t	dl_priority;
524 	dl_protect_t	dl_protection;
525 	t_scalar_t	dl_residual_error;
526 }	dl_qos_cl_range1_t;
527 
528 typedef struct {
529 	t_uscalar_t	dl_qos_type;
530 	t_scalar_t	dl_trans_delay;
531 	t_scalar_t	dl_priority;
532 	t_scalar_t	dl_protection;
533 	t_scalar_t	dl_residual_error;
534 }	dl_qos_cl_sel1_t;
535 
536 union	DL_qos_types {
537 	t_uscalar_t		dl_qos_type;
538 	dl_qos_co_range1_t	qos_co_range1;
539 	dl_qos_co_sel1_t	qos_co_sel1;
540 	dl_qos_cl_range1_t	qos_cl_range1;
541 	dl_qos_cl_sel1_t	qos_cl_sel1;
542 };
543 
544 /*
545  *    Solaris specific structures and definitions.
546  */
547 
548 /*
549  * The following are the capability types and structures used by the
550  * the DL_CAPABILITY_REQ and DL_CAPABILITY_ACK primitives.
551  *
552  * These primitives are used both to determine the set of capabilities in
553  * the DLS provider and also to turn on and off specific capabilities.
554  * The response is a DL_CAPABILITY_ACK or DL_ERROR_ACK.
555  *
556  * DL_CAPABILITY_REQ can either be empty (i.e. dl_sub_length is zero) which
557  * is a request for the driver to return all capabilities. Otherwise, the
558  * DL_CAPABILITY_REQ contains the capabilities the DLS user wants to use and
559  * their settings.
560  *
561  * DL_CAPABILITY_ACK contains the capabilities that the DLS provider can
562  * support modified based on what was listed in the request. If a
563  * capability was included in the request then the information returned
564  * in the ack might be modified based on the information in the request.
565  */
566 
567 #define	DL_CAPAB_ID_WRAPPER	0x00	/* Module ID wrapper structure */
568 					/* dl_data is dl_capab_id_t */
569 #define	DL_CAPAB_HCKSUM		0x01	/* Checksum offload */
570 					/* dl_data is dl_capab_hcksum_t */
571 #define	DL_CAPAB_IPSEC_AH	0x02	/* IPsec AH acceleration */
572 					/* dl_data is dl_capab_ipsec_t */
573 #define	DL_CAPAB_IPSEC_ESP	0x03	/* IPsec ESP acceleration */
574 					/* dl_data is dl_capab_ipsec_t */
575 #define	DL_CAPAB_MDT		0x04	/* Multidata Transmit capability */
576 					/* dl_data is dl_capab_mdt_t */
577 #define	DL_CAPAB_ZEROCOPY	0x05	/* Zero-copy capability */
578 					/* dl_data is dl_capab_zerocopy_t */
579 #define	DL_CAPAB_POLL		0x06	/* Polling capability */
580 					/* dl_data is dl_capab_poll_t */
581 
582 typedef struct {
583 	t_uscalar_t	dl_cap;		/* capability type */
584 	t_uscalar_t	dl_length;	/* length of data following */
585 	/* Followed by zero or more bytes of dl_data */
586 } dl_capability_sub_t;
587 
588 /*
589  * Definitions and structures needed for DL_CONTROL_REQ and DL_CONTROL_ACK
590  * primitives.
591  * Extensible message to send down control information to the DLS provider.
592  * The response is a DL_CONTROL_ACK or DL_ERROR_ACK.
593  *
594  * Different types of control operations will define different format for the
595  * key and data fields. ADD requires key and data fields; if the <type, key>
596  * matches an already existing entry a DL_ERROR_ACK will be returned. DELETE
597  * requires a key field; if the <type, key> does not exist, a DL_ERROR_ACK
598  * will be returned. FLUSH requires neither a key nor data; it
599  * unconditionally removes all entries for the specified type. GET requires a
600  * key field; the get operation returns the data for the <type, key>. If
601  * <type, key> doesn't exist a DL_ERROR_ACK is returned. UPDATE requires key
602  * and data fields; if <type, key> doesn't exist a DL_ERROR_ACK is returned.
603  */
604 
605 /*
606  * Control operations
607  */
608 #define	DL_CO_ADD	0x01	/* Add new entry matching for <type,key> */
609 #define	DL_CO_DELETE	0x02	/* Delete the entry matching <type,key> */
610 #define	DL_CO_FLUSH	0x03	/* Purge all entries of <type> */
611 #define	DL_CO_GET	0x04	/* Get the data for the <type,key> */
612 #define	DL_CO_UPDATE	0x05	/* Update the data for <type,key> */
613 #define	DL_CO_SET	0x06	/* Add or update as appropriate */
614 
615 /*
616  * Control types (dl_type field of dl_control_req_t and dl_control_ack_t)
617  */
618 #define	DL_CT_IPSEC_AH	0x01	/* AH; key=spi,dest_addr; */
619 				/* data=keying material */
620 #define	DL_CT_IPSEC_ESP	0x02	/* ESP; key=spi,des_taddr; */
621 				/* data=keying material */
622 
623 /*
624  * Module ID token to be included in new sub-capability structures.
625  * Existing sub-capabilities lacking an identification token, e.g. IPSEC
626  * hardware acceleration, need to be encapsulated within the ID sub-
627  * capability.  Access to this structure must be done through
628  * dlcapab{set,check}qid().
629  */
630 typedef struct {
631 	t_uscalar_t	mid[4];		/* private fields */
632 } dl_mid_t;
633 
634 /*
635  * Module ID wrapper (follows dl_capability_sub_t)
636  */
637 typedef struct {
638 	dl_mid_t		id_mid;		/* module ID token */
639 	dl_capability_sub_t	id_subcap;	/* sub-capability */
640 } dl_capab_id_t;
641 
642 /*
643  * Multidata Transmit sub-capability (follows dl_capability_sub_t)
644  */
645 typedef struct {
646 	t_uscalar_t	mdt_version;	/* interface version */
647 	t_uscalar_t	mdt_flags;	/* flags */
648 	t_uscalar_t	mdt_hdr_head;	/* minimum leading header space */
649 	t_uscalar_t	mdt_hdr_tail;	/* minimum trailing header space */
650 	t_uscalar_t	mdt_max_pld;	/* maximum doable payload buffers */
651 	t_uscalar_t	mdt_span_limit;	/* scatter-gather descriptor limit */
652 	dl_mid_t	mdt_mid;	/* module ID token */
653 } dl_capab_mdt_t;
654 
655 /*
656  * Multidata Transmit revision definition history
657  */
658 #define	MDT_CURRENT_VERSION	0x02
659 #define	MDT_VERSION_2		0x02
660 
661 /*
662  * mdt_flags values
663  */
664 #define	DL_CAPAB_MDT_ENABLE	0x01	/* enable Multidata Transmit */
665 
666 /*
667  * DL_CAPAB_HCKSUM
668  * Used for negotiating different flavors of checksum offload
669  * capabilities.
670  */
671 typedef struct {
672 	t_uscalar_t	hcksum_version;	/* version of data following */
673 	t_uscalar_t	hcksum_txflags;	/* capabilities on transmit */
674 	dl_mid_t	hcksum_mid;		/* module ID */
675 } dl_capab_hcksum_t;
676 
677 /*
678  * DL_CAPAB_HCKSUM  revision definition history
679  */
680 #define	HCKSUM_CURRENT_VERSION	0x01
681 #define	HCKSUM_VERSION_1	0x01
682 
683 /*
684  * Values for dl_txflags
685  */
686 #define	HCKSUM_ENABLE		0x01	/* Set to enable hardware checksum */
687 					/* capability */
688 #define	HCKSUM_INET_PARTIAL	0x02	/* Partial 1's complement checksum */
689 					/* ability */
690 #define	HCKSUM_INET_FULL_V4	0x04	/* Full 1's complement checksum */
691 					/* ability for IPv4 packets. */
692 #define	HCKSUM_IPHDRCKSUM	0x10	/* IPv4 Header checksum offload */
693 					/* capability */
694 #ifdef _KERNEL
695 
696 typedef struct dl_capab_poll_s {
697 	t_uscalar_t		poll_version;
698 	t_uscalar_t		poll_flags;
699 
700 	/* NIC provided information */
701 	uintptr_t		poll_tx_handle;
702 	uintptr_t		poll_tx;
703 
704 	/* IP provided information */
705 	uintptr_t		poll_rx_handle;
706 	uintptr_t		poll_rx;
707 	uintptr_t		poll_ring_add;
708 
709 	dl_mid_t		poll_mid;		/* module ID */
710 } dl_capab_poll_t;
711 
712 #define	POLL_CURRENT_VERSION	0x01
713 #define	POLL_VERSION_1		0x01
714 
715 /*
716  * Values for poll_flags
717  */
718 #define	POLL_ENABLE		0x01	/* Set to enable polling */
719 					/* capability */
720 #define	POLL_CAPABLE		0x02	/* Polling ability exists */
721 #define	POLL_DISABLE		0x04	/* Disable Polling */
722 
723 #endif /* _KERNEL */
724 
725 /*
726  * Zero-copy sub-capability (follows dl_capability_sub_t)
727  */
728 typedef struct {
729 	t_uscalar_t	zerocopy_version;	/* interface version */
730 	t_uscalar_t	zerocopy_flags;		/* capability flags */
731 	t_uscalar_t	reserved[9];		/* reserved fields */
732 	dl_mid_t	zerocopy_mid;		/* module ID */
733 } dl_capab_zerocopy_t;
734 
735 /*
736  * Zero-copy revision definition history
737  */
738 #define	ZEROCOPY_CURRENT_VERSION	0x01
739 #define	ZEROCOPY_VERSION_1		0x01
740 
741 /*
742  * Currently supported values of zerocopy_flags
743  */
744 #define	DL_CAPAB_VMSAFE_MEM		0x01	/* Driver is zero-copy safe */
745 						/* wrt VM named buffers on */
746 						/* transmit */
747 /*
748  * DLPI interface primitive definitions.
749  *
750  * Each primitive is sent as a stream message.  It is possible that
751  * the messages may be viewed as a sequence of bytes that have the
752  * following form without any padding. The structure definition
753  * of the following messages may have to change depending on the
754  * underlying hardware architecture and crossing of a hardware
755  * boundary with a different hardware architecture.
756  *
757  * Fields in the primitives having a name of the form
758  * dl_reserved cannot be used and have the value of
759  * binary zero, no bits turned on.
760  *
761  * Each message has the name defined followed by the
762  * stream message type (M_PROTO, M_PCPROTO, M_DATA)
763  */
764 
765 /*
766  *	LOCAL MANAGEMENT SERVICE PRIMITIVES
767  */
768 
769 /*
770  * DL_INFO_REQ, M_PCPROTO type
771  */
772 typedef struct {
773 	t_uscalar_t	dl_primitive;			/* set to DL_INFO_REQ */
774 } dl_info_req_t;
775 
776 /*
777  * DL_INFO_ACK, M_PCPROTO type
778  */
779 typedef struct {
780 	t_uscalar_t	dl_primitive;		/* set to DL_INFO_ACK */
781 	t_uscalar_t	dl_max_sdu;		/* Max bytes in a DLSDU */
782 	t_uscalar_t	dl_min_sdu;		/* Min bytes in a DLSDU */
783 	t_uscalar_t	dl_addr_length;		/* length of DLSAP address */
784 	t_uscalar_t	dl_mac_type;		/* type of medium supported */
785 	t_uscalar_t	dl_reserved;		/* value set to zero */
786 	t_uscalar_t	dl_current_state;	/* state of DLPI interface */
787 	t_scalar_t	dl_sap_length;		/* length of dlsap SAP part */
788 	t_uscalar_t	dl_service_mode;	/* CO, CL or ACL */
789 	t_uscalar_t	dl_qos_length;		/* length of qos values */
790 	t_uscalar_t	dl_qos_offset;		/* offset from start of block */
791 	t_uscalar_t	dl_qos_range_length;	/* available range of qos */
792 	t_uscalar_t	dl_qos_range_offset;	/* offset from start of block */
793 	t_uscalar_t	dl_provider_style;	/* style1 or style2 */
794 	t_uscalar_t	dl_addr_offset;		/* offset of the dlsap addr */
795 	t_uscalar_t	dl_version;		/* version number */
796 	t_uscalar_t	dl_brdcst_addr_length;	/* length of broadcast addr */
797 	t_uscalar_t	dl_brdcst_addr_offset;	/* offset from start of block */
798 	t_uscalar_t	dl_growth;		/* set to zero */
799 } dl_info_ack_t;
800 
801 /*
802  * DL_ATTACH_REQ, M_PROTO type
803  */
804 typedef struct {
805 	t_uscalar_t	dl_primitive;		/* set to DL_ATTACH_REQ */
806 	t_uscalar_t	dl_ppa;			/* id of the PPA */
807 } dl_attach_req_t;
808 
809 /*
810  * DL_DETACH_REQ, M_PROTO type
811  */
812 typedef struct {
813 	t_uscalar_t	dl_primitive;		/* set to DL_DETACH_REQ */
814 } dl_detach_req_t;
815 
816 /*
817  * DL_BIND_REQ, M_PROTO type
818  */
819 typedef struct {
820 	t_uscalar_t	dl_primitive;	/* set to DL_BIND_REQ */
821 	t_uscalar_t	dl_sap;		/* info to identify dlsap addr */
822 	t_uscalar_t	dl_max_conind;	/* max # of outstanding con_ind */
823 	uint16_t	dl_service_mode;	/* CO, CL or ACL */
824 	uint16_t	dl_conn_mgmt;	/* if non-zero, is con-mgmt stream */
825 	t_uscalar_t	dl_xidtest_flg;	/* auto init. of test and xid */
826 } dl_bind_req_t;
827 
828 /*
829  * DL_BIND_ACK, M_PCPROTO type
830  */
831 typedef struct {
832 	t_uscalar_t	dl_primitive;	/* DL_BIND_ACK */
833 	t_uscalar_t	dl_sap;		/* DLSAP addr info */
834 	t_uscalar_t	dl_addr_length;	/* length of complete DLSAP addr */
835 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PCPROTO */
836 	t_uscalar_t	dl_max_conind;	/* allowed max. # of con-ind */
837 	t_uscalar_t	dl_xidtest_flg;	/* responses supported by provider */
838 } dl_bind_ack_t;
839 
840 /*
841  * DL_SUBS_BIND_REQ, M_PROTO type
842  */
843 typedef struct {
844 	t_uscalar_t	dl_primitive;		/* DL_SUBS_BIND_REQ */
845 	t_uscalar_t	dl_subs_sap_offset;	/* offset of subs_sap */
846 	t_uscalar_t	dl_subs_sap_length;	/* length of subs_sap */
847 	t_uscalar_t	dl_subs_bind_class;	/* peer or hierarchical */
848 } dl_subs_bind_req_t;
849 
850 /*
851  * DL_SUBS_BIND_ACK, M_PCPROTO type
852  */
853 typedef struct {
854 	t_uscalar_t dl_primitive;	/* DL_SUBS_BIND_ACK */
855 	t_uscalar_t dl_subs_sap_offset;	/* offset of subs_sap */
856 	t_uscalar_t dl_subs_sap_length;	/* length of subs_sap */
857 } dl_subs_bind_ack_t;
858 
859 /*
860  * DL_UNBIND_REQ, M_PROTO type
861  */
862 typedef struct {
863 	t_uscalar_t	dl_primitive;	/* DL_UNBIND_REQ */
864 } dl_unbind_req_t;
865 
866 /*
867  * DL_SUBS_UNBIND_REQ, M_PROTO type
868  */
869 typedef struct {
870 	t_uscalar_t	dl_primitive;		/* DL_SUBS_UNBIND_REQ */
871 	t_uscalar_t	dl_subs_sap_offset;	/* offset of subs_sap */
872 	t_uscalar_t	dl_subs_sap_length;	/* length of subs_sap */
873 } dl_subs_unbind_req_t;
874 
875 /*
876  * DL_OK_ACK, M_PCPROTO type
877  */
878 typedef struct {
879 	t_uscalar_t	dl_primitive;		/* DL_OK_ACK */
880 	t_uscalar_t	dl_correct_primitive;	/* primitive acknowledged */
881 } dl_ok_ack_t;
882 
883 /*
884  * DL_ERROR_ACK, M_PCPROTO type
885  */
886 typedef struct {
887 	t_uscalar_t	dl_primitive;		/* DL_ERROR_ACK */
888 	t_uscalar_t	dl_error_primitive;	/* primitive in error */
889 	t_uscalar_t	dl_errno;		/* DLPI error code */
890 	t_uscalar_t	dl_unix_errno;		/* UNIX system error code */
891 } dl_error_ack_t;
892 
893 /*
894  * DL_ENABMULTI_REQ, M_PROTO type
895  */
896 typedef struct {
897 	t_uscalar_t	dl_primitive;	/* DL_ENABMULTI_REQ */
898 	t_uscalar_t	dl_addr_length;	/* length of multicast address */
899 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PROTO block */
900 } dl_enabmulti_req_t;
901 
902 /*
903  * DL_DISABMULTI_REQ, M_PROTO type
904  */
905 
906 typedef struct {
907 	t_uscalar_t	dl_primitive;	/* DL_DISABMULTI_REQ */
908 	t_uscalar_t	dl_addr_length;	/* length of multicast address */
909 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PROTO block */
910 } dl_disabmulti_req_t;
911 
912 /*
913  * DL_PROMISCON_REQ, M_PROTO type
914  */
915 
916 typedef struct {
917 	t_uscalar_t	dl_primitive;	/* DL_PROMISCON_REQ */
918 	t_uscalar_t	dl_level;	/* physical,SAP, or ALL multicast */
919 } dl_promiscon_req_t;
920 
921 /*
922  * DL_PROMISCOFF_REQ, M_PROTO type
923  */
924 
925 typedef struct {
926 	t_uscalar_t	dl_primitive;	/* DL_PROMISCOFF_REQ */
927 	t_uscalar_t	dl_level;	/* Physical,SAP, or ALL multicast */
928 } dl_promiscoff_req_t;
929 
930 /*
931  *	Primitives to get and set the Physical address
932  */
933 
934 /*
935  * DL_PHYS_ADDR_REQ, M_PROTO type
936  */
937 typedef	struct {
938 	t_uscalar_t	dl_primitive;	/* DL_PHYS_ADDR_REQ */
939 	t_uscalar_t	dl_addr_type;	/* factory or current physical addr */
940 } dl_phys_addr_req_t;
941 
942 /*
943  * DL_PHYS_ADDR_ACK, M_PCPROTO type
944  */
945 typedef struct {
946 	t_uscalar_t	dl_primitive;	/* DL_PHYS_ADDR_ACK */
947 	t_uscalar_t	dl_addr_length;	/* length of the physical addr */
948 	t_uscalar_t	dl_addr_offset;	/* offset from start of block */
949 } dl_phys_addr_ack_t;
950 
951 /*
952  * DL_SET_PHYS_ADDR_REQ, M_PROTO type
953  */
954 typedef struct {
955 	t_uscalar_t	dl_primitive;	/* DL_SET_PHYS_ADDR_REQ */
956 	t_uscalar_t	dl_addr_length;	/* length of physical addr */
957 	t_uscalar_t	dl_addr_offset;	/* offset from start of block */
958 } dl_set_phys_addr_req_t;
959 
960 /*
961  *	Primitives to get statistics
962  */
963 
964 /*
965  * DL_GET_STATISTICS_REQ, M_PROTO type
966  */
967 typedef struct {
968 	t_uscalar_t	dl_primitive;		/* DL_GET_STATISTICS_REQ */
969 } dl_get_statistics_req_t;
970 
971 /*
972  * DL_GET_STATISTICS_ACK, M_PCPROTO type
973  */
974 typedef struct {
975 	t_uscalar_t	dl_primitive;	/* DL_GET_STATISTICS_ACK */
976 	t_uscalar_t	dl_stat_length;	/* length of statistics structure */
977 	t_uscalar_t	dl_stat_offset;	/* offset from start of block */
978 } dl_get_statistics_ack_t;
979 
980 /*
981  *	Solaris specific local management service primitives
982  */
983 
984 /*
985  * DL_NOTIFY_REQ, M_PROTO type
986  */
987 typedef struct {
988 	t_uscalar_t	dl_primitive;	/* set to DL_NOTIFY_REQ */
989 	uint32_t	dl_notifications; /* Requested set of notifications */
990 	uint32_t	dl_timelimit;	/* In milliseconds */
991 } dl_notify_req_t;
992 
993 /*
994  * DL_NOTIFY_ACK, M_PROTO type
995  */
996 typedef struct {
997 	t_uscalar_t	dl_primitive;	/* set to DL_NOTIFY_ACK */
998 	uint32_t	dl_notifications; /* Supported set of notifications */
999 } dl_notify_ack_t;
1000 
1001 /*
1002  * DL_NOTIFY_IND, M_PROTO type
1003  */
1004 typedef struct {
1005 	t_uscalar_t	dl_primitive;	/* set to DL_NOTIFY_IND */
1006 	uint32_t	dl_notification; /* Which notification? */
1007 	uint32_t	dl_data;	/* notification specific */
1008 	t_uscalar_t	dl_addr_length;	/* length of complete DLSAP addr */
1009 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PROTO */
1010 } dl_notify_ind_t;
1011 
1012 /*
1013  * DL_AGGR_REQ, M_PROTO type
1014  */
1015 typedef struct {
1016 	t_uscalar_t	dl_primitive;	/* set to DL_AGGR_REQ */
1017 	uint32_t	dl_key;		/* Key identifying the group */
1018 	uint32_t	dl_port;	/* Identifying the NIC */
1019 	t_uscalar_t	dl_addr_length;	/* length of PHYS addr addr */
1020 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PROTO */
1021 } dl_aggr_req_t;
1022 
1023 /*
1024  * DL_AGGR_IND, M_PROTO type
1025  */
1026 typedef struct {
1027 	t_uscalar_t	dl_primitive;	/* set to DL_AGGR_IND */
1028 	uint32_t	dl_key;		/* Key identifying the group */
1029 	uint32_t	dl_port;	/* Identifying the NIC */
1030 	t_uscalar_t	dl_addr_length;	/* length of PHYS addr */
1031 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PROTO */
1032 } dl_aggr_ind_t;
1033 
1034 /*
1035  * DL_UNAGGR_REQ, M_PROTO type
1036  */
1037 typedef struct {
1038 	t_uscalar_t	dl_primitive;	/* set to DL_UNAGGR_REQ */
1039 	uint32_t	dl_key;		/* Key identifying the group */
1040 	uint32_t	dl_port;	/* Identifying the NIC */
1041 	t_uscalar_t	dl_addr_length;	/* length of PHYS addr */
1042 	t_uscalar_t	dl_addr_offset;	/* offset from start of M_PROTO */
1043 } dl_unaggr_req_t;
1044 
1045 /*
1046  * DL_CAPABILITY_REQ, M_PROTO type
1047  */
1048 typedef struct {
1049 	t_uscalar_t	dl_primitive;	/* DL_CAPABILITY_REQ */
1050 	t_uscalar_t	dl_sub_offset;	/* options offset */
1051 	t_uscalar_t	dl_sub_length;	/* options length */
1052 	/* Followed by a list of zero or more dl_capability_sub_t */
1053 } dl_capability_req_t;
1054 
1055 /*
1056  * DL_CAPABILITY_ACK, M_PROTO type
1057  */
1058 typedef struct {
1059 	t_uscalar_t	dl_primitive;	/* DL_CAPABILITY_ACK */
1060 	t_uscalar_t	dl_sub_offset;	/* options offset */
1061 	t_uscalar_t	dl_sub_length;	/* options length */
1062 	/* Followed by a list of zero or more dl_capability_sub_t */
1063 } dl_capability_ack_t;
1064 
1065 /*
1066  * DL_CONTROL_REQ, M_PROTO type
1067  */
1068 typedef struct {
1069 	t_uscalar_t	dl_primitive;	/* DL_CONTROL_REQ */
1070 	t_uscalar_t	dl_operation;	/* add/delete/purge */
1071 	t_uscalar_t	dl_type;	/* e.g. AH/ESP/ ... */
1072 	t_uscalar_t	dl_key_offset;	/* offset of key */
1073 	t_uscalar_t	dl_key_length;	/* length of key */
1074 	t_uscalar_t	dl_data_offset;	/* offset of data */
1075 	t_uscalar_t	dl_data_length;	/* length of data */
1076 } dl_control_req_t;
1077 
1078 /*
1079  * DL_CONTROL_ACK, M_PROTO type
1080  */
1081 typedef struct {
1082 	t_uscalar_t	dl_primitive;	/* DL_CONTROL_ACK */
1083 	t_uscalar_t	dl_operation;	/* add/delete/purge */
1084 	t_uscalar_t	dl_type;	/* e.g. AH/ESP/ ... */
1085 	t_uscalar_t	dl_key_offset;	/* offset of key */
1086 	t_uscalar_t	dl_key_length;	/* length of key */
1087 	t_uscalar_t	dl_data_offset;	/* offset of data */
1088 	t_uscalar_t	dl_data_length;	/* length of data */
1089 } dl_control_ack_t;
1090 
1091 /*
1092  * DL_PASSIVE_REQ, M_PROTO type
1093  */
1094 typedef struct {
1095 	t_uscalar_t	dl_primitive;
1096 } dl_passive_req_t;
1097 
1098 /*
1099  *	CONNECTION-ORIENTED SERVICE PRIMITIVES
1100  */
1101 
1102 /*
1103  * DL_CONNECT_REQ, M_PROTO type
1104  */
1105 typedef struct {
1106 	t_uscalar_t	dl_primitive;		/* DL_CONNECT_REQ */
1107 	t_uscalar_t	dl_dest_addr_length;	/* len. of dlsap addr */
1108 	t_uscalar_t	dl_dest_addr_offset;	/* offset */
1109 	t_uscalar_t	dl_qos_length;		/* len. of QOS parm val */
1110 	t_uscalar_t	dl_qos_offset;		/* offset */
1111 	t_uscalar_t	dl_growth;		/* set to zero */
1112 } dl_connect_req_t;
1113 
1114 /*
1115  * DL_CONNECT_IND, M_PROTO type
1116  */
1117 typedef struct {
1118 	t_uscalar_t	dl_primitive;		/* DL_CONNECT_IND */
1119 	t_uscalar_t	dl_correlation;		/* provider's correl. token */
1120 	t_uscalar_t	dl_called_addr_length;  /* length of called address */
1121 	t_uscalar_t	dl_called_addr_offset;	/* offset from start of block */
1122 	t_uscalar_t	dl_calling_addr_length;	/* length of calling address */
1123 	t_uscalar_t	dl_calling_addr_offset;	/* offset from start of block */
1124 	t_uscalar_t	dl_qos_length;		/* length of qos structure */
1125 	t_uscalar_t	dl_qos_offset;		/* offset from start of block */
1126 	t_uscalar_t	dl_growth;		/* set to zero */
1127 } dl_connect_ind_t;
1128 
1129 /*
1130  * DL_CONNECT_RES, M_PROTO type
1131  */
1132 typedef struct {
1133 	t_uscalar_t	dl_primitive;	/* DL_CONNECT_RES */
1134 	t_uscalar_t	dl_correlation; /* provider's correlation token */
1135 	t_uscalar_t	dl_resp_token;	/* token of responding stream */
1136 	t_uscalar_t	dl_qos_length;  /* length of qos structure */
1137 	t_uscalar_t	dl_qos_offset;	/* offset from start of block */
1138 	t_uscalar_t	dl_growth;	/* set to zero */
1139 } dl_connect_res_t;
1140 
1141 /*
1142  * DL_CONNECT_CON, M_PROTO type
1143  */
1144 typedef struct {
1145 	t_uscalar_t	dl_primitive;		/* DL_CONNECT_CON */
1146 	t_uscalar_t	dl_resp_addr_length;	/* responder's address len */
1147 	t_uscalar_t	dl_resp_addr_offset;	/* offset from start of block */
1148 	t_uscalar_t	dl_qos_length;		/* length of qos structure */
1149 	t_uscalar_t	dl_qos_offset;		/* offset from start of block */
1150 	t_uscalar_t	dl_growth;		/* set to zero */
1151 } dl_connect_con_t;
1152 
1153 /*
1154  * DL_TOKEN_REQ, M_PCPROTO type
1155  */
1156 typedef struct {
1157 	t_uscalar_t	dl_primitive;	/* DL_TOKEN_REQ */
1158 } dl_token_req_t;
1159 
1160 /*
1161  * DL_TOKEN_ACK, M_PCPROTO type
1162  */
1163 typedef struct {
1164 	t_uscalar_t	dl_primitive;	/* DL_TOKEN_ACK */
1165 	t_uscalar_t	dl_token;	/* Connection response token */
1166 }dl_token_ack_t;
1167 
1168 /*
1169  * DL_DISCONNECT_REQ, M_PROTO type
1170  */
1171 typedef struct {
1172 	t_uscalar_t	dl_primitive;	/* DL_DISCONNECT_REQ */
1173 	t_uscalar_t	dl_reason;	/* norm., abnorm., perm. or trans. */
1174 	t_uscalar_t	dl_correlation; /* association with connect_ind */
1175 } dl_disconnect_req_t;
1176 
1177 /*
1178  * DL_DISCONNECT_IND, M_PROTO type
1179  */
1180 typedef struct {
1181 	t_uscalar_t	dl_primitive;	/* DL_DISCONNECT_IND */
1182 	t_uscalar_t	dl_originator;	/* USER or PROVIDER */
1183 	t_uscalar_t	dl_reason;	/* permanent or transient */
1184 	t_uscalar_t	dl_correlation;	/* association with connect_ind */
1185 } dl_disconnect_ind_t;
1186 
1187 /*
1188  * DL_RESET_REQ, M_PROTO type
1189  */
1190 typedef struct {
1191 	t_uscalar_t	dl_primitive;	/* DL_RESET_REQ */
1192 } dl_reset_req_t;
1193 
1194 /*
1195  * DL_RESET_IND, M_PROTO type
1196  */
1197 typedef struct {
1198 	t_uscalar_t	dl_primitive;	/* DL_RESET_IND */
1199 	t_uscalar_t	dl_originator;	/* Provider or User */
1200 	t_uscalar_t	dl_reason;	/* flow control, link error, resync */
1201 } dl_reset_ind_t;
1202 
1203 /*
1204  * DL_RESET_RES, M_PROTO type
1205  */
1206 typedef struct {
1207 	t_uscalar_t	dl_primitive;		/* DL_RESET_RES */
1208 } dl_reset_res_t;
1209 
1210 /*
1211  * DL_RESET_CON, M_PROTO type
1212  */
1213 typedef struct {
1214 	t_uscalar_t	dl_primitive;		/* DL_RESET_CON */
1215 } dl_reset_con_t;
1216 
1217 
1218 /*
1219  *	CONNECTIONLESS SERVICE PRIMITIVES
1220  */
1221 
1222 /*
1223  * DL_UNITDATA_REQ, M_PROTO type, with M_DATA block(s)
1224  */
1225 typedef struct {
1226 	t_uscalar_t	dl_primitive;		/* DL_UNITDATA_REQ */
1227 	t_uscalar_t	dl_dest_addr_length;	/* DLSAP length of dest. user */
1228 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1229 	dl_priority_t	dl_priority;	/* priority value */
1230 } dl_unitdata_req_t;
1231 
1232 /*
1233  * DL_UNITDATA_IND, M_PROTO type, with M_DATA block(s)
1234  */
1235 typedef struct {
1236 	t_uscalar_t	dl_primitive;		/* DL_UNITDATA_IND */
1237 	t_uscalar_t	dl_dest_addr_length;	/* DLSAP length of dest. user */
1238 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1239 	t_uscalar_t	dl_src_addr_length;	/* DLSAP addr length sender */
1240 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1241 	t_uscalar_t	dl_group_address;	/* one if multicast/broadcast */
1242 } dl_unitdata_ind_t;
1243 
1244 /*
1245  * DL_UDERROR_IND, M_PROTO type
1246  *	(or M_PCPROTO type if LLI-based provider)
1247  */
1248 typedef struct {
1249 	t_uscalar_t	dl_primitive;		/* DL_UDERROR_IND */
1250 	t_uscalar_t	dl_dest_addr_length;	/* Destination DLSAP */
1251 	t_uscalar_t	dl_dest_addr_offset;	/* Offset from start of block */
1252 	t_uscalar_t	dl_unix_errno;		/* unix system error code */
1253 	t_uscalar_t	dl_errno;		/* DLPI error code */
1254 } dl_uderror_ind_t;
1255 
1256 /*
1257  * DL_UDQOS_REQ, M_PROTO type
1258  */
1259 typedef struct {
1260 	t_uscalar_t	dl_primitive;	/* DL_UDQOS_REQ */
1261 	t_uscalar_t	dl_qos_length;	/* requested qos byte length */
1262 	t_uscalar_t	dl_qos_offset;	/* offset from start of block */
1263 } dl_udqos_req_t;
1264 
1265 /*
1266  *	Primitives to handle XID and TEST operations
1267  */
1268 
1269 /*
1270  * DL_TEST_REQ, M_PROTO type
1271  */
1272 typedef struct {
1273 	t_uscalar_t	dl_primitive;		/* DL_TEST_REQ */
1274 	t_uscalar_t	dl_flag;		/* poll/final */
1275 	t_uscalar_t	dl_dest_addr_length;	/* DLSAP length of dest. user */
1276 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1277 } dl_test_req_t;
1278 
1279 /*
1280  * DL_TEST_IND, M_PROTO type
1281  */
1282 typedef struct {
1283 	t_uscalar_t	dl_primitive;		/* DL_TEST_IND */
1284 	t_uscalar_t	dl_flag;		/* poll/final */
1285 	t_uscalar_t	dl_dest_addr_length;	/* dlsap length of dest. user */
1286 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1287 	t_uscalar_t	dl_src_addr_length;	/* dlsap length of source */
1288 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1289 } dl_test_ind_t;
1290 
1291 /*
1292  *	DL_TEST_RES, M_PROTO type
1293  */
1294 typedef struct {
1295 	t_uscalar_t	dl_primitive;		/* DL_TEST_RES */
1296 	t_uscalar_t	dl_flag;		/* poll/final */
1297 	t_uscalar_t	dl_dest_addr_length;	/* DLSAP length of dest. user */
1298 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1299 } dl_test_res_t;
1300 
1301 /*
1302  *	DL_TEST_CON, M_PROTO type
1303  */
1304 typedef struct {
1305 	t_uscalar_t	dl_primitive;		/* DL_TEST_CON */
1306 	t_uscalar_t	dl_flag;		/* poll/final */
1307 	t_uscalar_t	dl_dest_addr_length;	/* dlsap length of dest. user */
1308 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1309 	t_uscalar_t	dl_src_addr_length;	/* dlsap length of source */
1310 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1311 } dl_test_con_t;
1312 
1313 /*
1314  * DL_XID_REQ, M_PROTO type
1315  */
1316 typedef struct {
1317 	t_uscalar_t	dl_primitive;		/* DL_XID_REQ */
1318 	t_uscalar_t	dl_flag;		/* poll/final */
1319 	t_uscalar_t	dl_dest_addr_length;	/* dlsap length of dest. user */
1320 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1321 } dl_xid_req_t;
1322 
1323 /*
1324  * DL_XID_IND, M_PROTO type
1325  */
1326 typedef struct {
1327 	t_uscalar_t	dl_primitive;		/* DL_XID_IND */
1328 	t_uscalar_t	dl_flag;		/* poll/final */
1329 	t_uscalar_t	dl_dest_addr_length;	/* dlsap length of dest. user */
1330 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1331 	t_uscalar_t	dl_src_addr_length;	/* dlsap length of source */
1332 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1333 } dl_xid_ind_t;
1334 
1335 /*
1336  *	DL_XID_RES, M_PROTO type
1337  */
1338 typedef struct {
1339 	t_uscalar_t	dl_primitive;		/* DL_XID_RES */
1340 	t_uscalar_t	dl_flag;		/* poll/final */
1341 	t_uscalar_t	dl_dest_addr_length;	/* DLSAP length of dest. user */
1342 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1343 } dl_xid_res_t;
1344 
1345 /*
1346  *	DL_XID_CON, M_PROTO type
1347  */
1348 typedef struct {
1349 	t_uscalar_t	dl_primitive;		/* DL_XID_CON */
1350 	t_uscalar_t	dl_flag;		/* poll/final */
1351 	t_uscalar_t	dl_dest_addr_length;	/* dlsap length of dest. user */
1352 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1353 	t_uscalar_t	dl_src_addr_length;	/* dlsap length of source */
1354 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1355 } dl_xid_con_t;
1356 
1357 /*
1358  *	ACKNOWLEDGED CONNECTIONLESS SERVICE PRIMITIVES
1359  */
1360 
1361 /*
1362  * DL_DATA_ACK_REQ, M_PROTO type
1363  */
1364 typedef struct {
1365 	t_uscalar_t	dl_primitive;		/* DL_DATA_ACK_REQ */
1366 	t_uscalar_t	dl_correlation;		/* User's correlation token */
1367 	t_uscalar_t	dl_dest_addr_length;	/* length of destination addr */
1368 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1369 	t_uscalar_t	dl_src_addr_length;	/* length of source address */
1370 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1371 	t_uscalar_t	dl_priority;		/* priority */
1372 	t_uscalar_t	dl_service_class;	/* DL_RQST_RSP|DL_RQST_NORSP */
1373 } dl_data_ack_req_t;
1374 
1375 /*
1376  * DL_DATA_ACK_IND, M_PROTO type
1377  */
1378 typedef struct {
1379 	t_uscalar_t	dl_primitive;		/* DL_DATA_ACK_IND */
1380 	t_uscalar_t	dl_dest_addr_length;	/* length of destination addr */
1381 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1382 	t_uscalar_t	dl_src_addr_length;	/* length of source address */
1383 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1384 	t_uscalar_t	dl_priority;		/* pri. for data unit transm. */
1385 	t_uscalar_t	dl_service_class;	/* DL_RQST_RSP|DL_RQST_NORSP */
1386 } dl_data_ack_ind_t;
1387 
1388 /*
1389  * DL_DATA_ACK_STATUS_IND, M_PROTO type
1390  */
1391 typedef struct {
1392 	t_uscalar_t	dl_primitive;	/* DL_DATA_ACK_STATUS_IND */
1393 	t_uscalar_t	dl_correlation;	/* User's correlation token */
1394 	t_uscalar_t	dl_status;	/* success or failure of previous req */
1395 } dl_data_ack_status_ind_t;
1396 
1397 /*
1398  * DL_REPLY_REQ, M_PROTO type
1399  */
1400 typedef struct {
1401 	t_uscalar_t	dl_primitive;		/* DL_REPLY_REQ */
1402 	t_uscalar_t	dl_correlation;		/* User's correlation token */
1403 	t_uscalar_t	dl_dest_addr_length;	/* destination address length */
1404 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1405 	t_uscalar_t	dl_src_addr_length;	/* source address length */
1406 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1407 	t_uscalar_t	dl_priority;		/* pri for data unit trans. */
1408 	t_uscalar_t	dl_service_class;
1409 } dl_reply_req_t;
1410 
1411 /*
1412  * DL_REPLY_IND, M_PROTO type
1413  */
1414 typedef struct {
1415 	t_uscalar_t	dl_primitive;		/* DL_REPLY_IND */
1416 	t_uscalar_t	dl_dest_addr_length;	/* destination address length */
1417 	t_uscalar_t	dl_dest_addr_offset;	/* offset from start of block */
1418 	t_uscalar_t	dl_src_addr_length;	/* length of source address */
1419 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1420 	t_uscalar_t	dl_priority;		/* pri for data unit trans. */
1421 	t_uscalar_t	dl_service_class;	/* DL_RQST_RSP|DL_RQST_NORSP */
1422 } dl_reply_ind_t;
1423 
1424 /*
1425  * DL_REPLY_STATUS_IND, M_PROTO type
1426  */
1427 typedef struct {
1428 	t_uscalar_t	dl_primitive;	/* DL_REPLY_STATUS_IND */
1429 	t_uscalar_t	dl_correlation;	/* User's correlation token */
1430 	t_uscalar_t	dl_status;	/* success or failure of previous req */
1431 } dl_reply_status_ind_t;
1432 
1433 /*
1434  * DL_REPLY_UPDATE_REQ, M_PROTO type
1435  */
1436 typedef struct {
1437 	t_uscalar_t	dl_primitive;		/* DL_REPLY_UPDATE_REQ */
1438 	t_uscalar_t	dl_correlation;		/* user's correlation token */
1439 	t_uscalar_t	dl_src_addr_length;	/* length of source address */
1440 	t_uscalar_t	dl_src_addr_offset;	/* offset from start of block */
1441 } dl_reply_update_req_t;
1442 
1443 /*
1444  * DL_REPLY_UPDATE_STATUS_IND, M_PROTO type
1445  */
1446 typedef struct {
1447 	t_uscalar_t	dl_primitive;	/* DL_REPLY_UPDATE_STATUS_IND */
1448 	t_uscalar_t	dl_correlation;	/* User's correlation token */
1449 	t_uscalar_t	dl_status;	/* success or failure of previous req */
1450 } dl_reply_update_status_ind_t;
1451 
1452 union DL_primitives {
1453 	t_uscalar_t		dl_primitive;
1454 	dl_info_req_t		info_req;
1455 	dl_info_ack_t		info_ack;
1456 	dl_attach_req_t		attach_req;
1457 	dl_detach_req_t		detach_req;
1458 	dl_bind_req_t		bind_req;
1459 	dl_bind_ack_t		bind_ack;
1460 	dl_unbind_req_t		unbind_req;
1461 	dl_subs_bind_req_t	subs_bind_req;
1462 	dl_subs_bind_ack_t	subs_bind_ack;
1463 	dl_subs_unbind_req_t	subs_unbind_req;
1464 	dl_ok_ack_t		ok_ack;
1465 	dl_error_ack_t		error_ack;
1466 	dl_connect_req_t	connect_req;
1467 	dl_connect_ind_t	connect_ind;
1468 	dl_connect_res_t	connect_res;
1469 	dl_connect_con_t	connect_con;
1470 	dl_token_req_t		token_req;
1471 	dl_token_ack_t		token_ack;
1472 	dl_disconnect_req_t	disconnect_req;
1473 	dl_disconnect_ind_t	disconnect_ind;
1474 	dl_reset_req_t		reset_req;
1475 	dl_reset_ind_t		reset_ind;
1476 	dl_reset_res_t		reset_res;
1477 	dl_reset_con_t		reset_con;
1478 	dl_unitdata_req_t	unitdata_req;
1479 	dl_unitdata_ind_t	unitdata_ind;
1480 	dl_uderror_ind_t	uderror_ind;
1481 	dl_udqos_req_t		udqos_req;
1482 	dl_enabmulti_req_t	enabmulti_req;
1483 	dl_disabmulti_req_t	disabmulti_req;
1484 	dl_promiscon_req_t	promiscon_req;
1485 	dl_promiscoff_req_t	promiscoff_req;
1486 	dl_phys_addr_req_t	physaddr_req;
1487 	dl_phys_addr_ack_t	physaddr_ack;
1488 	dl_set_phys_addr_req_t	set_physaddr_req;
1489 	dl_get_statistics_req_t	get_statistics_req;
1490 	dl_get_statistics_ack_t	get_statistics_ack;
1491 	dl_notify_req_t		notify_req;
1492 	dl_notify_ack_t		notify_ack;
1493 	dl_notify_ind_t		notify_ind;
1494 	dl_aggr_req_t		aggr_req;
1495 	dl_aggr_ind_t		aggr_ind;
1496 	dl_unaggr_req_t		unaggr_req;
1497 	dl_test_req_t		test_req;
1498 	dl_test_ind_t		test_ind;
1499 	dl_test_res_t		test_res;
1500 	dl_test_con_t		test_con;
1501 	dl_xid_req_t		xid_req;
1502 	dl_xid_ind_t		xid_ind;
1503 	dl_xid_res_t		xid_res;
1504 	dl_xid_con_t		xid_con;
1505 	dl_data_ack_req_t	data_ack_req;
1506 	dl_data_ack_ind_t	data_ack_ind;
1507 	dl_data_ack_status_ind_t	data_ack_status_ind;
1508 	dl_reply_req_t		reply_req;
1509 	dl_reply_ind_t		reply_ind;
1510 	dl_reply_status_ind_t	reply_status_ind;
1511 	dl_reply_update_req_t	reply_update_req;
1512 	dl_reply_update_status_ind_t	reply_update_status_ind;
1513 	dl_capability_req_t	capability_req;
1514 	dl_capability_ack_t	capability_ack;
1515 	dl_control_req_t	control_req;
1516 	dl_control_ack_t	control_ack;
1517 	dl_passive_req_t	passive_req;
1518 };
1519 
1520 #define	DL_INFO_REQ_SIZE	sizeof (dl_info_req_t)
1521 #define	DL_INFO_ACK_SIZE	sizeof (dl_info_ack_t)
1522 #define	DL_ATTACH_REQ_SIZE	sizeof (dl_attach_req_t)
1523 #define	DL_DETACH_REQ_SIZE	sizeof (dl_detach_req_t)
1524 #define	DL_BIND_REQ_SIZE	sizeof (dl_bind_req_t)
1525 #define	DL_BIND_ACK_SIZE	sizeof (dl_bind_ack_t)
1526 #define	DL_UNBIND_REQ_SIZE	sizeof (dl_unbind_req_t)
1527 #define	DL_SUBS_BIND_REQ_SIZE	sizeof (dl_subs_bind_req_t)
1528 #define	DL_SUBS_BIND_ACK_SIZE	sizeof (dl_subs_bind_ack_t)
1529 #define	DL_SUBS_UNBIND_REQ_SIZE	sizeof (dl_subs_unbind_req_t)
1530 #define	DL_OK_ACK_SIZE		sizeof (dl_ok_ack_t)
1531 #define	DL_ERROR_ACK_SIZE	sizeof (dl_error_ack_t)
1532 #define	DL_CONNECT_REQ_SIZE	sizeof (dl_connect_req_t)
1533 #define	DL_CONNECT_IND_SIZE	sizeof (dl_connect_ind_t)
1534 #define	DL_CONNECT_RES_SIZE	sizeof (dl_connect_res_t)
1535 #define	DL_CONNECT_CON_SIZE	sizeof (dl_connect_con_t)
1536 #define	DL_TOKEN_REQ_SIZE	sizeof (dl_token_req_t)
1537 #define	DL_TOKEN_ACK_SIZE	sizeof (dl_token_ack_t)
1538 #define	DL_DISCONNECT_REQ_SIZE	sizeof (dl_disconnect_req_t)
1539 #define	DL_DISCONNECT_IND_SIZE	sizeof (dl_disconnect_ind_t)
1540 #define	DL_RESET_REQ_SIZE	sizeof (dl_reset_req_t)
1541 #define	DL_RESET_IND_SIZE	sizeof (dl_reset_ind_t)
1542 #define	DL_RESET_RES_SIZE	sizeof (dl_reset_res_t)
1543 #define	DL_RESET_CON_SIZE	sizeof (dl_reset_con_t)
1544 #define	DL_UNITDATA_REQ_SIZE	sizeof (dl_unitdata_req_t)
1545 #define	DL_UNITDATA_IND_SIZE	sizeof (dl_unitdata_ind_t)
1546 #define	DL_UDERROR_IND_SIZE	sizeof (dl_uderror_ind_t)
1547 #define	DL_UDQOS_REQ_SIZE	sizeof (dl_udqos_req_t)
1548 #define	DL_ENABMULTI_REQ_SIZE	sizeof (dl_enabmulti_req_t)
1549 #define	DL_DISABMULTI_REQ_SIZE	sizeof (dl_disabmulti_req_t)
1550 #define	DL_PROMISCON_REQ_SIZE	sizeof (dl_promiscon_req_t)
1551 #define	DL_PROMISCOFF_REQ_SIZE	sizeof (dl_promiscoff_req_t)
1552 #define	DL_PHYS_ADDR_REQ_SIZE	sizeof (dl_phys_addr_req_t)
1553 #define	DL_PHYS_ADDR_ACK_SIZE	sizeof (dl_phys_addr_ack_t)
1554 #define	DL_SET_PHYS_ADDR_REQ_SIZE	sizeof (dl_set_phys_addr_req_t)
1555 #define	DL_GET_STATISTICS_REQ_SIZE	sizeof (dl_get_statistics_req_t)
1556 #define	DL_GET_STATISTICS_ACK_SIZE	sizeof (dl_get_statistics_ack_t)
1557 #define	DL_NOTIFY_REQ_SIZE	sizeof (dl_notify_req_t)
1558 #define	DL_NOTIFY_ACK_SIZE	sizeof (dl_notify_ack_t)
1559 #define	DL_NOTIFY_IND_SIZE	sizeof (dl_notify_ind_t)
1560 #define	DL_AGGR_REQ_SIZE	sizeof (dl_aggr_req_t)
1561 #define	DL_AGGR_IND_SIZE	sizeof (dl_aggr_ind_t)
1562 #define	DL_UNAGGR_REQ_SIZE	sizeof (dl_unaggr_req_t)
1563 #define	DL_XID_REQ_SIZE		sizeof (dl_xid_req_t)
1564 #define	DL_XID_IND_SIZE		sizeof (dl_xid_ind_t)
1565 #define	DL_XID_RES_SIZE		sizeof (dl_xid_res_t)
1566 #define	DL_XID_CON_SIZE		sizeof (dl_xid_con_t)
1567 #define	DL_TEST_REQ_SIZE	sizeof (dl_test_req_t)
1568 #define	DL_TEST_IND_SIZE	sizeof (dl_test_ind_t)
1569 #define	DL_TEST_RES_SIZE	sizeof (dl_test_res_t)
1570 #define	DL_TEST_CON_SIZE	sizeof (dl_test_con_t)
1571 #define	DL_DATA_ACK_REQ_SIZE	sizeof (dl_data_ack_req_t)
1572 #define	DL_DATA_ACK_IND_SIZE	sizeof (dl_data_ack_ind_t)
1573 #define	DL_DATA_ACK_STATUS_IND_SIZE	sizeof (dl_data_ack_status_ind_t)
1574 #define	DL_REPLY_REQ_SIZE	sizeof (dl_reply_req_t)
1575 #define	DL_REPLY_IND_SIZE	sizeof (dl_reply_ind_t)
1576 #define	DL_REPLY_STATUS_IND_SIZE	sizeof (dl_reply_status_ind_t)
1577 #define	DL_REPLY_UPDATE_REQ_SIZE	sizeof (dl_reply_update_req_t)
1578 #define	DL_REPLY_UPDATE_STATUS_IND_SIZE	sizeof (dl_reply_update_status_ind_t)
1579 #define	DL_CAPABILITY_REQ_SIZE	sizeof (dl_capability_req_t)
1580 #define	DL_CAPABILITY_ACK_SIZE	sizeof (dl_capability_ack_t)
1581 #define	DL_CONTROL_REQ_SIZE	sizeof (dl_control_req_t)
1582 #define	DL_CONTROL_ACK_SIZE	sizeof (dl_control_ack_t)
1583 #define	DL_PASSIVE_REQ_SIZE	sizeof (dl_passive_req_t)
1584 
1585 #ifdef	_KERNEL
1586 /*
1587  * The following are unstable, internal DLPI utility routines.
1588  */
1589 extern void	dlbindack(queue_t *, mblk_t *, t_scalar_t, void *, t_uscalar_t,
1590 		    t_uscalar_t, t_uscalar_t);
1591 extern void	dlokack(queue_t *, mblk_t *, t_uscalar_t);
1592 extern void	dlerrorack(queue_t *, mblk_t *, t_uscalar_t, t_uscalar_t,
1593 		    t_uscalar_t);
1594 extern void	dluderrorind(queue_t *, mblk_t *, void *, t_uscalar_t,
1595 		    t_uscalar_t, t_uscalar_t);
1596 extern void	dlphysaddrack(queue_t *, mblk_t *, void *, t_uscalar_t);
1597 extern void	dlcapabsetqid(dl_mid_t *, const queue_t *);
1598 extern boolean_t dlcapabcheckqid(const dl_mid_t *, const queue_t *);
1599 extern void	dlnotifyack(queue_t *, mblk_t *, uint32_t);
1600 #endif	/* _KERNEL */
1601 
1602 #ifdef	__cplusplus
1603 }
1604 #endif
1605 
1606 #endif /* _SYS_DLPI_H */
1607