6811333 Remove prom_printf() message in emlxs driver
[opensolaris.git] / usr / src / uts / common / sys / tihdr.h
blob005a96e3467897b7bfe08bda55b6d4185bf8dbbb
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
20 * CDDL HEADER END
22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
23 /* All Rights Reserved */
27 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
28 * Use is subject to license terms.
31 #ifndef _SYS_TIHDR_H
32 #define _SYS_TIHDR_H
34 #pragma ident "%Z%%M% %I% %E% SMI" /* from SVr4.0 11.4 */
36 #include <sys/types.h>
38 * Include declarations implicit to TPI and shared with user level code
40 #include <sys/tpicommon.h>
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
47 * The feature test macro, _SUN_TPI_VERSION makes some of additional
48 * declarations available and changes some existing ones. There was
49 * some changes done to this interface and this feature test macro
50 * enables transitioning to those changes while maintaining retaining
51 * backward compatibility.
53 * The following is all the information
54 * needed by the Transport Service Interface.
58 * The following are the definitions of the Transport
59 * Service Interface primitives.
63 * Primitives that are initiated by the transport user.
65 #define T_CONN_REQ 0 /* connection request */
66 #if _SUN_TPI_VERSION > 1
67 #define O_T_CONN_RES 1 /* old connection response */
68 #else
69 #define T_CONN_RES 1 /* connection response */
70 #endif /* _SUN_TPI_VERSION > 1 */
71 #define T_DISCON_REQ 2 /* disconnect request */
72 #define T_DATA_REQ 3 /* data request */
73 #define T_EXDATA_REQ 4 /* expedited data request */
74 #define T_INFO_REQ 5 /* information request */
76 * Bind Request primitive (TLI inspired
77 * address binding semantics). If requested address is
78 * found to be busy, an alternative free address is
79 * returned. (Requires comparison of requested address to
80 * returned address to verify if the requested address was
81 * bound)
84 #if _SUN_TPI_VERSION > 0
85 #define O_T_BIND_REQ 6
86 #else
87 #define T_BIND_REQ 6
88 #endif /* _SUN_TPI_VERSION > 0 */
90 #define T_UNBIND_REQ 7 /* unbind request */
91 #define T_UNITDATA_REQ 8 /* unitdata request */
94 * Option management request (with TLI inspired semantics )
95 * The preferred name for this primitive in new code is T_SVR4_OPTMGMT_REQ.
96 * This primitive had the name T_OPTMGMT_REQ in old SVR4 derived TPI.
97 * This primitive is used for TLI and Socket API support.
98 * The packing of options in option buffer is private contract
99 * between transport provider and its users and can differ
100 * between different transports.
101 * (The name O_T_OPTMGMT_REQ continues to exist for Solaris 2.6
102 * compilation environment compatibility only)
105 #define T_SVR4_OPTMGMT_REQ 9
106 #if _SUN_TPI_VERSION > 0
107 #define O_T_OPTMGMT_REQ T_SVR4_OPTMGMT_REQ
108 #else
109 #define T_OPTMGMT_REQ T_SVR4_OPTMGMT_REQ
110 #endif /* _SUN_TPI_VERSION > 0 */
112 #define T_ORDREL_REQ 10 /* orderly release req */
115 * Primitives that are initiated by the transport provider.
117 #define T_CONN_IND 11 /* connection indication */
118 #define T_CONN_CON 12 /* connection confirmation */
119 #define T_DISCON_IND 13 /* disconnect indication */
120 #define T_DATA_IND 14 /* data indication */
121 #define T_EXDATA_IND 15 /* expeditied data indication */
122 #define T_INFO_ACK 16 /* information acknowledgment */
123 #define T_BIND_ACK 17 /* bind acknowledment */
124 #define T_ERROR_ACK 18 /* error acknowledgment */
125 #define T_OK_ACK 19 /* ok acknowledgment */
126 #define T_UNITDATA_IND 20 /* unitdata indication */
127 #define T_UDERROR_IND 21 /* unitdata error indication */
128 #define T_OPTMGMT_ACK 22 /* manage options ack */
129 #define T_ORDREL_IND 23 /* orderly release ind */
131 * Primitives added to namespace and contain a mix of ones
132 * initiated by transport user or provider.
134 #define T_ADDR_REQ 24 /* address request */
135 #define T_ADDR_ACK 25 /* address acknowledgement */
137 #if _SUN_TPI_VERSION > 0
139 * Bind request primitive with better address
140 * binding semantics. (XTI inspired)
141 * If the requested address is found to be busy,
142 * an error is returned. (No need to compare addresses on successful
143 * bind acknowledgement).
145 #define T_BIND_REQ 26 /* bind request */
148 * Option management request (with XTI inspired semantics)
149 * The packing of options in option buffer is required to
150 * be with 'struct T_opthdr' data structure defined later in
151 * this header.
153 #define T_OPTMGMT_REQ 27 /* manage options req - T_opthdr option header */
154 #endif /* _SUN_TPI_VERSION > 0 */
156 #if _SUN_TPI_VERSION > 1
158 * The connection response that expects its ACCEPTOR_id to have been
159 * filled in from the value supplied via a T_CAPABILITY_ACK.
161 #define T_CONN_RES 28 /* connection response */
164 * Capability request and ack. These primitives are optional and
165 * subsume the functionality of T_INFO_{REQ,ACK}.
167 #define T_CAPABILITY_REQ 30
168 #define T_CAPABILITY_ACK 31
169 #endif /* _SUN_TPI_VERSION > 1 */
171 #ifdef _KERNEL
173 * Sun private TPI extensions. They are currently used for transparently
174 * passing options through the connection-oriented loopback transport,
175 * and for setting the kernel SSL proxy.
176 * Values assigned to them may change.
178 * T_EXTCONN_IND (extended T_CONN_IND) is used to return dst as well as
179 * src addr/port.
181 #define T_OPTDATA_REQ 0x1001 /* data (with options) request */
182 #define T_OPTDATA_IND 0x1002 /* data (with options) indication */
183 #define T_EXTCONN_IND 0x1003 /* extended T_CONN_IND to return dst as well */
185 #define T_SSL_PROXY_BIND_REQ 0x1004 /* extended T_BIND_REQ to carry a */
186 /* kssl_entry_t to the transport. */
187 #define T_SSL_PROXY_CONN_IND 0x1005 /* conn_ind from an SSL proxy */
188 /* endpoint, carrying a kssl_ctx_t */
190 #endif /* _KERNEL */
193 * The following are the events that drive the state machine
195 /* Initialization events */
196 #define TE_BIND_REQ 0 /* bind request */
197 #define TE_UNBIND_REQ 1 /* unbind request */
198 #define TE_OPTMGMT_REQ 2 /* manage options req */
199 #define TE_BIND_ACK 3 /* bind acknowledment */
200 #define TE_OPTMGMT_ACK 4 /* manage options ack */
201 #define TE_ERROR_ACK 5 /* error acknowledgment */
202 #define TE_OK_ACK1 6 /* ok ack seqcnt == 0 */
203 #define TE_OK_ACK2 7 /* ok ack seqcnt == 1, q == resq */
204 #define TE_OK_ACK3 8 /* ok ack seqcnt == 1, q != resq */
205 #define TE_OK_ACK4 9 /* ok ack seqcnt > 1 */
207 /* Connection oriented events */
208 #define TE_CONN_REQ 10 /* connection request */
209 #define TE_CONN_RES 11 /* connection response */
210 #define TE_DISCON_REQ 12 /* disconnect request */
211 #define TE_DATA_REQ 13 /* data request */
212 #define TE_EXDATA_REQ 14 /* expedited data request */
213 #define TE_ORDREL_REQ 15 /* orderly release req */
214 #define TE_CONN_IND 16 /* connection indication */
215 #define TE_CONN_CON 17 /* connection confirmation */
216 #define TE_DATA_IND 18 /* data indication */
217 #define TE_EXDATA_IND 19 /* expedited data indication */
218 #define TE_ORDREL_IND 20 /* orderly release ind */
219 #define TE_DISCON_IND1 21 /* disconnect indication seq == 0 */
220 #define TE_DISCON_IND2 22 /* disconnect indication seq == 1 */
221 #define TE_DISCON_IND3 23 /* disconnect indication seq > 1 */
222 #define TE_PASS_CONN 24 /* pass connection */
224 /* Unit data events */
225 #define TE_UNITDATA_REQ 25 /* unitdata request */
226 #define TE_UNITDATA_IND 26 /* unitdata indication */
227 #define TE_UDERROR_IND 27 /* unitdata error indication */
229 #define TE_NOEVENTS 28
231 * The following are the possible states of the Transport
232 * Service Interface
235 #define TS_UNBND 0 /* unbound */
236 #define TS_WACK_BREQ 1 /* waiting ack of BIND_REQ */
237 #define TS_WACK_UREQ 2 /* waiting ack of UNBIND_REQ */
238 #define TS_IDLE 3 /* idle */
239 #define TS_WACK_OPTREQ 4 /* wait ack options request */
240 #define TS_WACK_CREQ 5 /* waiting ack of CONN_REQ */
241 #define TS_WCON_CREQ 6 /* waiting confirm of CONN_REQ */
242 #define TS_WRES_CIND 7 /* waiting response of CONN_IND */
243 #define TS_WACK_CRES 8 /* waiting ack of CONN_RES */
244 #define TS_DATA_XFER 9 /* data transfer */
245 #define TS_WIND_ORDREL 10 /* releasing rd but not wr */
246 #define TS_WREQ_ORDREL 11 /* wait to release wr but not rd */
247 #define TS_WACK_DREQ6 12 /* waiting ack of DISCON_REQ */
248 #define TS_WACK_DREQ7 13 /* waiting ack of DISCON_REQ */
249 #define TS_WACK_DREQ9 14 /* waiting ack of DISCON_REQ */
250 #define TS_WACK_DREQ10 15 /* waiting ack of DISCON_REQ */
251 #define TS_WACK_DREQ11 16 /* waiting ack of DISCON_REQ */
253 #define TS_NOSTATES 17
257 * The following structure definitions define the format of the
258 * stream message block of the above primitives.
259 * (everything is declared t_scalar_t to ensure proper alignment
260 * across different machines)
263 /* connection request */
265 struct T_conn_req {
266 t_scalar_t PRIM_type; /* always T_CONN_REQ */
267 t_scalar_t DEST_length; /* dest addr length */
268 t_scalar_t DEST_offset; /* dest addr offset */
269 t_scalar_t OPT_length; /* options length */
270 t_scalar_t OPT_offset; /* options offset */
273 /* connect response */
276 * Historical compatibility note for "struct T_conn_res" usage.
277 * "QUEUE_ptr" field of type "queue_t" is obsolete to support
278 * code portability and application binary compatibility
279 * between ILP32(32-bit) and LP64 (64-bit) environments.
280 * Use field "ACCEPTOR_id" instead.
281 * For compatibility, drivers using (_SUN_TPI_VERSION >= 2) interface
282 * can support treating ACCEPTOR_id content as queue pointer
283 * only when PRIM_type is O_T_CONN_RES.
285 struct T_conn_res {
286 t_scalar_t PRIM_type; /* T_CONN_RES (or O_T_CONN_RES) */
287 t_uscalar_t ACCEPTOR_id; /* id of accepting endpoint */
288 t_scalar_t OPT_length; /* options length */
289 t_scalar_t OPT_offset; /* options offset */
290 t_scalar_t SEQ_number; /* sequence number */
293 /* disconnect request */
295 struct T_discon_req {
296 t_scalar_t PRIM_type; /* always T_DISCON_REQ */
297 t_scalar_t SEQ_number; /* sequnce number */
300 /* data request */
302 struct T_data_req {
303 t_scalar_t PRIM_type; /* always T_DATA_REQ */
304 t_scalar_t MORE_flag; /* more data */
307 /* expedited data request */
309 struct T_exdata_req {
310 t_scalar_t PRIM_type; /* always T_EXDATA_REQ */
311 t_scalar_t MORE_flag; /* more data */
314 /* information request */
316 struct T_info_req {
317 t_scalar_t PRIM_type; /* always T_INFO_REQ */
320 /* bind request */
322 struct T_bind_req {
323 t_scalar_t PRIM_type; /* T_BIND_REQ (or O_T_BIND_REQ) */
324 t_scalar_t ADDR_length; /* addr length */
325 t_scalar_t ADDR_offset; /* addr offset */
326 t_uscalar_t CONIND_number; /* connect indications requested */
329 /* unbind request */
331 struct T_unbind_req {
332 t_scalar_t PRIM_type; /* always T_UNBIND_REQ */
335 /* unitdata request */
337 struct T_unitdata_req {
338 t_scalar_t PRIM_type; /* always T_UNITDATA_REQ */
339 t_scalar_t DEST_length; /* dest addr length */
340 t_scalar_t DEST_offset; /* dest addr offset */
341 t_scalar_t OPT_length; /* options length */
342 t_scalar_t OPT_offset; /* options offset */
345 /* manage options request */
347 struct T_optmgmt_req {
348 t_scalar_t PRIM_type; /* T_OPTMGMT_REQ or */
349 /* T_SVR4_OPTMGMT_REQ */
350 t_scalar_t OPT_length; /* options length */
351 t_scalar_t OPT_offset; /* options offset */
352 t_scalar_t MGMT_flags; /* options flags */
355 /* orderly release request */
357 struct T_ordrel_req {
358 t_scalar_t PRIM_type; /* always T_ORDREL_REQ */
361 /* protocol address request */
363 struct T_addr_req {
364 t_scalar_t PRIM_type; /* always T_ADDR_REQ */
367 /* connect indication */
369 struct T_conn_ind {
370 t_scalar_t PRIM_type; /* always T_CONN_IND */
371 t_scalar_t SRC_length; /* src addr length */
372 t_scalar_t SRC_offset; /* src addr offset */
373 t_scalar_t OPT_length; /* option length */
374 t_scalar_t OPT_offset; /* option offset */
375 t_scalar_t SEQ_number; /* sequnce number */
378 /* connect confirmation */
380 struct T_conn_con {
381 t_scalar_t PRIM_type; /* always T_CONN_CON */
382 t_scalar_t RES_length; /* responding addr length */
383 t_scalar_t RES_offset; /* responding addr offset */
384 t_scalar_t OPT_length; /* option length */
385 t_scalar_t OPT_offset; /* option offset */
388 /* disconnect indication */
390 struct T_discon_ind {
391 t_scalar_t PRIM_type; /* always T_DISCON_IND */
392 t_scalar_t DISCON_reason; /* disconnect reason */
393 t_scalar_t SEQ_number; /* sequnce number */
396 /* data indication */
398 struct T_data_ind {
399 t_scalar_t PRIM_type; /* always T_DATA_IND */
400 t_scalar_t MORE_flag; /* more data */
403 /* expedited data indication */
405 struct T_exdata_ind {
406 t_scalar_t PRIM_type; /* always T_EXDATA_IND */
407 t_scalar_t MORE_flag; /* more data */
410 /* information acknowledgment */
412 struct T_info_ack {
413 t_scalar_t PRIM_type; /* always T_INFO_ACK */
414 t_scalar_t TSDU_size; /* max TSDU size */
415 t_scalar_t ETSDU_size; /* max ETSDU size */
416 t_scalar_t CDATA_size; /* max connect data size */
417 t_scalar_t DDATA_size; /* max discon data size */
418 t_scalar_t ADDR_size; /* address size */
419 t_scalar_t OPT_size; /* options size */
420 t_scalar_t TIDU_size; /* max TIDU size */
421 t_scalar_t SERV_type; /* provider service type */
422 t_scalar_t CURRENT_state; /* current state */
423 t_scalar_t PROVIDER_flag; /* provider flags */
427 * The following are definitions of flags available to the transport
428 * provider to set in the PROVIDER_flag field of the T_info_ack
429 * structure.
432 #if _SUN_TPI_VERSION > 0
433 #define SENDZERO 0x0001 /* provider can handle --length TSDUs */
435 #define OLD_SENDZERO 0x1000 /* reserved for compatibility with */
436 /* old providers- old value of */
437 /* SENDZERO defined in <sys/timod.h> */
438 #else
439 #define SENDZERO 0x1000 /* old SENDZERO value */
440 #endif /* _SUN_TPI_VERSION > 0 */
442 #define EXPINLINE 0x0002 /* provider wants ETSDUs in band 0 */
444 * Flag XPG4_1:
445 * transport provider supports TPI modifications motivated by and
446 * in conjunction with XTI inspired TPI support and all the
447 * compatibility baggage that implies.
448 * It implies, - primitives T_ADDR_REQ & T_ADDR_ACK supported
449 * - primitives O_T_BIND_REQ & T_BIND_REQ separately supported
450 * - primitives T_SVR4_OPTMGMT_REQ & T_OPTMGMT_REQ separately
451 * supported.
453 #define XPG4_1 0x0004
455 /* bind acknowledgment */
457 struct T_bind_ack {
458 t_scalar_t PRIM_type; /* always T_BIND_ACK */
459 t_scalar_t ADDR_length; /* addr length */
460 t_scalar_t ADDR_offset; /* addr offset */
461 t_uscalar_t CONIND_number; /* connect ind to be queued */
464 /* error acknowledgment */
466 struct T_error_ack {
467 t_scalar_t PRIM_type; /* always T_ERROR_ACK */
468 t_scalar_t ERROR_prim; /* primitive in error */
469 t_scalar_t TLI_error; /* TLI error code */
470 t_scalar_t UNIX_error; /* UNIX error code */
473 /* ok acknowledgment */
475 struct T_ok_ack {
476 t_scalar_t PRIM_type; /* always T_OK_ACK */
477 t_scalar_t CORRECT_prim; /* correct primitive */
480 /* unitdata indication */
482 struct T_unitdata_ind {
483 t_scalar_t PRIM_type; /* always T_UNITDATA_IND */
484 t_scalar_t SRC_length; /* source addr length */
485 t_scalar_t SRC_offset; /* source addr offset */
486 t_scalar_t OPT_length; /* options length */
487 t_scalar_t OPT_offset; /* options offset */
490 /* unitdata error indication */
492 struct T_uderror_ind {
493 t_scalar_t PRIM_type; /* always T_UDERROR_IND */
494 t_scalar_t DEST_length; /* dest addr length */
495 t_scalar_t DEST_offset; /* dest addr offset */
496 t_scalar_t OPT_length; /* options length */
497 t_scalar_t OPT_offset; /* options offset */
498 t_scalar_t ERROR_type; /* error type */
501 /* manage options ack */
503 struct T_optmgmt_ack {
504 t_scalar_t PRIM_type; /* always T_OPTMGMT_ACK */
505 t_scalar_t OPT_length; /* options length */
506 t_scalar_t OPT_offset; /* options offset */
507 t_scalar_t MGMT_flags; /* managment flags */
510 /* orderly release indication */
512 struct T_ordrel_ind {
513 t_scalar_t PRIM_type; /* always T_ORDREL_IND */
517 /* protocol address acknowledgment */
519 struct T_addr_ack {
520 t_scalar_t PRIM_type; /* always T_ADDR_ACK */
521 t_scalar_t LOCADDR_length; /* length of local address */
522 t_scalar_t LOCADDR_offset; /* offset of local address */
523 t_scalar_t REMADDR_length; /* length of remote address */
524 t_scalar_t REMADDR_offset; /* offset of remote address */
527 #if _SUN_TPI_VERSION > 1
529 * Capability request and ack. These primitives are optional and
530 * subsume the functionality of T_INFO_{REQ,ACK}.
532 struct T_capability_req {
533 t_scalar_t PRIM_type; /* always T_CAPABILITY_REQ */
534 t_uscalar_t CAP_bits1; /* capability bits #1 */
537 struct T_capability_ack {
538 t_scalar_t PRIM_type; /* always T_CAPABILITY_ACK */
539 t_uscalar_t CAP_bits1; /* capability bits #1 */
540 struct T_info_ack
541 INFO_ack; /* info acknowledgement */
542 t_uscalar_t ACCEPTOR_id; /* accepting endpoint id */
545 #define TC1_INFO (1u << 0) /* Info request/ack */
546 #define TC1_ACCEPTOR_ID (1u << 1) /* Acceptor_id request/ack */
547 #define TC1_CAP_BITS2 (1u << 31) /* Reserved for future use */
549 #endif /* _SUN_TPI_VERSION > 1 */
551 #ifdef _KERNEL
553 * Private Sun TPI extensions.
556 /* data (with options) request */
557 struct T_optdata_req {
558 t_scalar_t PRIM_type; /* always T_OPTDATA_REQ */
559 t_scalar_t DATA_flag; /* flags like "more data" */
560 t_scalar_t OPT_length; /* options length */
561 t_scalar_t OPT_offset; /* options offset */
564 /* data (with options) indication */
565 struct T_optdata_ind {
566 t_scalar_t PRIM_type; /* always T_OPTDATA_IND */
567 t_scalar_t DATA_flag; /* flags like "more data" */
568 t_scalar_t OPT_length; /* options length */
569 t_scalar_t OPT_offset; /* options offset */
572 /* extended connect indication to return dst addr/port as well as src */
573 struct T_extconn_ind {
574 t_scalar_t PRIM_type; /* always T_EXTCONN_IND */
575 t_scalar_t SRC_length; /* src addr length */
576 t_scalar_t SRC_offset; /* src addr offset */
577 t_scalar_t OPT_length; /* option length */
578 t_scalar_t OPT_offset; /* option offset */
579 t_scalar_t SEQ_number; /* sequnce number */
580 t_scalar_t DEST_length; /* dest addr length */
581 t_scalar_t DEST_offset; /* dest addr offset */
583 #endif /* _KERNEL */
586 * The following is a union of the primitives
588 union T_primitives {
589 t_scalar_t type; /* primitive type */
590 struct T_conn_req conn_req; /* connect request */
591 struct T_conn_res conn_res; /* connect response */
592 struct T_discon_req discon_req; /* disconnect request */
593 struct T_data_req data_req; /* data request */
594 struct T_exdata_req exdata_req; /* expedited data req */
595 struct T_info_req info_req; /* information req */
596 struct T_bind_req bind_req; /* bind request */
597 struct T_unbind_req unbind_req; /* unbind request */
598 struct T_unitdata_req unitdata_req; /* unitdata requset */
599 struct T_optmgmt_req optmgmt_req; /* manage opt req */
600 struct T_ordrel_req ordrel_req; /* orderly rel req */
601 struct T_addr_req addr_req; /* address request */
602 struct T_conn_ind conn_ind; /* connect indication */
603 struct T_conn_con conn_con; /* connect corfirm */
604 struct T_discon_ind discon_ind; /* discon indication */
605 struct T_data_ind data_ind; /* data indication */
606 struct T_exdata_ind exdata_ind; /* expedited data ind */
607 struct T_info_ack info_ack; /* info ack */
608 struct T_bind_ack bind_ack; /* bind ack */
609 struct T_error_ack error_ack; /* error ack */
610 struct T_ok_ack ok_ack; /* ok ack */
611 struct T_unitdata_ind unitdata_ind; /* unitdata ind */
612 struct T_uderror_ind uderror_ind; /* unitdata error ind */
613 struct T_optmgmt_ack optmgmt_ack; /* manage opt ack */
614 struct T_ordrel_ind ordrel_ind; /* orderly rel ind */
615 struct T_addr_ack addr_ack; /* address ack */
616 #if _SUN_TPI_VERSION > 1
617 struct T_capability_req capability_req; /* capability req */
618 struct T_capability_ack capability_ack; /* capability ack */
619 #endif /* _SUN_TPI_VERSION > 1 */
620 #ifdef _KERNEL
621 struct T_optdata_req optdata_req; /* option data request */
622 struct T_optdata_ind optdata_ind; /* option data ind */
623 struct T_extconn_ind extconn_ind; /* above plus dst addr */
624 #endif /* _KERNEL */
628 * TPI specification is not clear on how to pack options in option
629 * buffers. What follows is the Solaris TPI interpretation of it.
631 * struct T_opthdr data structure is used to pack options in T_OPTMGMT_{REQ,ACK}
632 * message primitives in buffer delimited by [OPT_offset, OPT_length] fields in
633 * struct T_optmgmt_req/T_optmgmt_ack data structures.
635 * It is also used to pack options in similar buffers for data structures in
636 * T_CONN_{REQ,IND,RES,CONN} primitives and T_UNITDATA_{REQ,IND} primitives
637 * Needs to be on t_uscalar_t (32-bit word) aligned boundary.
639 * Note: T_SVR4_OPTMGMT_REQ primitive can, but need not, use this data
640 * structure for packing options. The format of option buffer for
641 * T_SVR4_OPTMGMT_REQ primitive is undefined and is a private contract
642 * between transport provider and its users.
644 * |<--------------first option---------------->| |<--second option--...
645 * ______________________________________ _ _ _ ____________________________
646 * | len | level | name | status | value.......| / / | len ...
647 * -------------------------------------- - - - ----------------------------
648 * |32bit| 32bit |32bit | 32bit | ^ | 32bit...
651 * alignment characters
653 struct T_opthdr {
654 t_uscalar_t len; /* total length of option (header+value) */
655 t_uscalar_t level; /* protocol level */
656 t_uscalar_t name; /* option name */
657 t_uscalar_t status; /* status value */
658 /* option value aligned on t_uscalar_t (32-bit) alignment boundary */
662 * ------------------------------------------------------------------------
663 * Common experimental private TPI alignment related macros. Not for
664 * use outside Solaris bundled code and can change in any release.
665 * The alignment boundary _TPI_ALIGN_SIZE represents an implementation
666 * choice for aligning many data objects which are directly or indirectly
667 * associated with Solaris TPI implementation.
668 * ------------------------------------------------------------------------
671 #define __TPI_ALIGN_SIZE (sizeof (t_scalar_t))
672 #define __TPI_ALIGN(x) \
673 (((uintptr_t)(x) + __TPI_ALIGN_SIZE - 1) & ~(__TPI_ALIGN_SIZE - 1))
674 #define __TPI_SIZE_ISALIGNED(x) \
675 (((uintptr_t)(x) & (__TPI_ALIGN_SIZE - 1)) == 0)
678 * TPI primitive in message must be aligned at _TPI_ALIGN_SIZE boundary
680 #define __TPI_PRIM_ISALIGNED(x) __TPI_SIZE_ISALIGNED(x)
683 * TPI option header "struct opthdr" objects must be aligned
684 * at __TPI_ALIGN_SIZE boundary.
686 #define __TPI_OPT_ISALIGNED(x) __TPI_SIZE_ISALIGNED(x)
687 #define _TPI_ALIGN_OPT(x) __TPI_ALIGN(x)
690 * TPI option header "struct T_opthdr" objects must be aligned
691 * at __TPI_ALIGN_SIZE boundary.
693 #define __TPI_TOPT_ISALIGNED(x) __TPI_SIZE_ISALIGNED(x)
694 #define _TPI_ALIGN_TOPT(x) __TPI_ALIGN(x)
697 * --------------------------------------------------------------------
698 * Private experimental macros. Not for use outside Solaris bundled
699 * source code and can change in any release.
700 * Macros that operate on struct T_opthdr. These are roughly modelled
701 * after the corresponding Socket CMSG_*() and XTI T_OPT_*() macros, but
702 * are applied to TPI option buffers.
703 * --------------------------------------------------------------------
705 * unsigned char *
706 * _TPI_TOPT_DATA(struct T_opthdr *tohp):
707 * Get start of data part after option header
709 #define _TPI_TOPT_DATA(tohp) \
710 ((unsigned char *)((char *)(tohp) + sizeof (struct T_opthdr)))
713 * t_uscalar_t
714 * _TPI_TOPT_DATALEN(tohp)
715 * Get length of contents of option data excluding header (and
716 * padding etc if any).
718 #define _TPI_TOPT_DATALEN(tohp) ((tohp)->len - sizeof (struct T_opthdr))
721 * struct T_opthdr *
722 * _TPI_TOPT_FIRSTHDR(char *pbuf, t_scalar_t buflen):
723 * Get pointer to the first option header in buffer 'pbuf'
724 * Return NULL if there is not enough room for the header
726 * struct T_opthdr *
727 * _TPI_TOPT_NEXTHDR(char *pbuf, t_scalar_t buflen,
728 * struct T_opthdr *popt):
729 * Skip to next option header
731 * Notes: _TPI_TOPT_NEXTHDR performs the roundup of the length.
733 * If _TPI_TOPT_{FIRST,NEXT}HDR returns a non-null value, the user of
734 * _TPI_TOPT_{FIRST,NEXT}HDR must still verify that the resulting pointer
735 * is valid, by making a call to _TPI_TOPT_VALID. The _TPI_TOPT_VALID
736 * macro does not assume that the last option buffer is padded.
738 #define _TPI_TOPT_FIRSTHDR(pbuf, buflen) \
739 ((((buflen) >= (unsigned int) sizeof (struct T_opthdr)) && \
740 __TPI_TOPT_ISALIGNED(pbuf)) ? \
741 (struct T_opthdr *)(pbuf) : (struct T_opthdr *)0)
743 #define _TPI_TOPT_NEXTHDR(pbuf, buflen, popt) \
744 (((char *)(popt) + _TPI_ALIGN_TOPT((popt)->len)) < \
745 ((char *)(pbuf) + (buflen)) ? \
746 (struct T_opthdr *)((char *)(popt) + _TPI_ALIGN_TOPT((popt)->len)) : \
747 (struct T_opthdr *)0)
750 * bool_t
751 * _TPI_TOPT_VALID(struct T_opthdr *tohp, char *start, char *end)
752 * Validate the option header at tohp, for its alignment and length.
753 * 1. check that tohp is aligned at t_scalar_t boundary
754 * 2. check that start <= tohp < end
755 * 3. validate the length, should be >= sizeof(T_opthdr) and
756 * check that there is no pointer arithmetic overflow.
757 * (could be caused by a very large value for tohp->len)
760 #define _TPI_TOPT_VALID(tohp, start, end) \
761 (__TPI_TOPT_ISALIGNED(tohp) && \
762 ((uintptr_t)(tohp) >= (uintptr_t)(start)) && \
763 ((uintptr_t)(tohp) < (uintptr_t)(end)) && \
764 ((ssize_t)(tohp)->len >= sizeof (struct T_opthdr)) && \
765 ((uintptr_t)(tohp) + (tohp)->len <= (uintptr_t)(end)) && \
766 ((uintptr_t)(tohp) + (tohp)->len >= (uintptr_t)(tohp) + \
767 sizeof (struct T_opthdr)))
769 #ifdef __cplusplus
771 #endif
773 #endif /* _SYS_TIHDR_H */