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