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