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