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, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     23 /*	All Rights Reserved	*/
     24 
     25 
     26 /*
     27  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
     28  * Use is subject to license terms.
     29  */
     30 
     31 #ifndef _SYS_TIHDR_H
     32 #define	_SYS_TIHDR_H
     33 
     34 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* from SVr4.0 11.4 */
     35 
     36 #include <sys/types.h>
     37 /*
     38  * Include declarations implicit to TPI and shared with user level code
     39  */
     40 #include <sys/tpicommon.h>
     41 
     42 #ifdef	__cplusplus
     43 extern "C" {
     44 #endif
     45 
     46 /*
     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.
     52  *
     53  * The following is all the information
     54  * needed by the Transport Service Interface.
     55  */
     56 
     57 /*
     58  * The following are the definitions of the Transport
     59  * Service Interface primitives.
     60  */
     61 
     62 /*
     63  * Primitives that are initiated by the transport user.
     64  */
     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		*/
     75 /*
     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)
     82  *
     83  */
     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 */
     89 
     90 #define	T_UNBIND_REQ	7	/* unbind request		*/
     91 #define	T_UNITDATA_REQ	8	/* unitdata request		*/
     92 
     93 /*
     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)
    103  *
    104  */
    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 */
    111 
    112 #define	T_ORDREL_REQ	10	/* orderly release req		*/
    113 
    114 /*
    115  * Primitives that are initiated by the transport provider.
    116  */
    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		*/
    130 /*
    131  * Primitives added to namespace and contain a mix of ones
    132  * initiated by transport user or provider.
    133  */
    134 #define	T_ADDR_REQ	24	/* address request		*/
    135 #define	T_ADDR_ACK	25	/* address acknowledgement	*/
    136 
    137 #if _SUN_TPI_VERSION > 0
    138 /*
    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).
    144  */
    145 #define	T_BIND_REQ	26	/* bind request			*/
    146 
    147 /*
    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.
    152  */
    153 #define	T_OPTMGMT_REQ	27 /* manage options req - T_opthdr option header */
    154 #endif /* _SUN_TPI_VERSION > 0 */
    155 
    156 #if _SUN_TPI_VERSION > 1
    157 /*
    158  * The connection response that expects its ACCEPTOR_id to have been
    159  * filled in from the value supplied via a T_CAPABILITY_ACK.
    160  */
    161 #define	T_CONN_RES	28	/* connection response		*/
    162 
    163 /*
    164  * Capability request and ack.  These primitives are optional and
    165  * subsume the functionality of T_INFO_{REQ,ACK}.
    166  */
    167 #define	T_CAPABILITY_REQ	30
    168 #define	T_CAPABILITY_ACK	31
    169 #endif /* _SUN_TPI_VERSION > 1 */
    170 
    171 #ifdef _KERNEL
    172 /*
    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.
    177  *
    178  * T_EXTCONN_IND (extended T_CONN_IND) is used to return dst as well as
    179  * src addr/port.
    180  */
    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 */
    184 
    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 */
    189 
    190 #endif /* _KERNEL */
    191 
    192 /*
    193  * The following are the events that drive the state machine
    194  */
    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			*/
    206 
    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			*/
    223 
    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		*/
    228 
    229 #define	TE_NOEVENTS	28
    230 /*
    231  * The following are the possible states of the Transport
    232  * Service Interface
    233  */
    234 
    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	*/
    252 
    253 #define	TS_NOSTATES		17
    254 
    255 
    256 /*
    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)
    261  */
    262 
    263 /* connection request */
    264 
    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		*/
    271 };
    272 
    273 /* connect response */
    274 
    275 /*
    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.
    284  */
    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		*/
    291 };
    292 
    293 /* disconnect request */
    294 
    295 struct T_discon_req {
    296 	t_scalar_t	PRIM_type;	/* always T_DISCON_REQ		*/
    297 	t_scalar_t	SEQ_number;	/* sequnce number		*/
    298 };
    299 
    300 /* data request */
    301 
    302 struct T_data_req {
    303 	t_scalar_t	PRIM_type;	/* always T_DATA_REQ		*/
    304 	t_scalar_t	MORE_flag;	/* more data			*/
    305 };
    306 
    307 /* expedited data request */
    308 
    309 struct T_exdata_req {
    310 	t_scalar_t	PRIM_type;	/* always T_EXDATA_REQ		*/
    311 	t_scalar_t	MORE_flag;	/* more data			*/
    312 };
    313 
    314 /* information request */
    315 
    316 struct T_info_req {
    317 	t_scalar_t	PRIM_type;	/* always T_INFO_REQ		*/
    318 };
    319 
    320 /* bind request */
    321 
    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 */
    327 };
    328 
    329 /* unbind request */
    330 
    331 struct T_unbind_req {
    332 	t_scalar_t	PRIM_type;	/* always T_UNBIND_REQ		*/
    333 };
    334 
    335 /* unitdata request */
    336 
    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		*/
    343 };
    344 
    345 /* manage options request */
    346 
    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		*/
    353 };
    354 
    355 /* orderly release request */
    356 
    357 struct T_ordrel_req {
    358 	t_scalar_t	PRIM_type;	/* always T_ORDREL_REQ		*/
    359 };
    360 
    361 /* protocol address request */
    362 
    363 struct T_addr_req {
    364 	t_scalar_t	PRIM_type;	/* always T_ADDR_REQ		*/
    365 };
    366 
    367 /* connect indication */
    368 
    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		*/
    376 };
    377 
    378 /* connect confirmation */
    379 
    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		*/
    386 };
    387 
    388 /* disconnect indication */
    389 
    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		*/
    394 };
    395 
    396 /* data indication */
    397 
    398 struct T_data_ind {
    399 	t_scalar_t	PRIM_type;	/* always T_DATA_IND		*/
    400 	t_scalar_t	MORE_flag;	/* more data			*/
    401 };
    402 
    403 /* expedited data indication */
    404 
    405 struct T_exdata_ind {
    406 	t_scalar_t	PRIM_type;	/* always T_EXDATA_IND		*/
    407 	t_scalar_t	MORE_flag;	/* more data			*/
    408 };
    409 
    410 /* information acknowledgment */
    411 
    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		*/
    424 };
    425 
    426 /*
    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.
    430  */
    431 
    432 #if _SUN_TPI_VERSION > 0
    433 #define	SENDZERO	0x0001	/* provider can handle --length TSDUs */
    434 
    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 */
    441 
    442 #define	EXPINLINE	0x0002	/* provider wants ETSDUs in band 0 */
    443 /*
    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.
    452  */
    453 #define	XPG4_1		0x0004
    454 
    455 /* bind acknowledgment */
    456 
    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	*/
    462 };
    463 
    464 /* error acknowledgment */
    465 
    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		*/
    471 };
    472 
    473 /* ok acknowledgment */
    474 
    475 struct T_ok_ack {
    476 	t_scalar_t	PRIM_type;	/* always T_OK_ACK		*/
    477 	t_scalar_t	CORRECT_prim;	/* correct primitive		*/
    478 };
    479 
    480 /* unitdata indication */
    481 
    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		*/
    488 };
    489 
    490 /* unitdata error indication */
    491 
    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			*/
    499 };
    500 
    501 /* manage options ack */
    502 
    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		*/
    508 };
    509 
    510 /* orderly release indication */
    511 
    512 struct T_ordrel_ind {
    513 	t_scalar_t	PRIM_type;	/* always T_ORDREL_IND		*/
    514 };
    515 
    516 
    517 /* protocol address acknowledgment */
    518 
    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	*/
    525 };
    526 
    527 #if _SUN_TPI_VERSION > 1
    528 /*
    529  * Capability request and ack.  These primitives are optional and
    530  * subsume the functionality of T_INFO_{REQ,ACK}.
    531  */
    532 struct T_capability_req {
    533 	t_scalar_t	PRIM_type;	/* always T_CAPABILITY_REQ 	*/
    534 	t_uscalar_t	CAP_bits1;	/* capability bits #1		*/
    535 };
    536 
    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	*/
    543 };
    544 
    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	*/
    548 
    549 #endif /* _SUN_TPI_VERSION > 1 */
    550 
    551 #ifdef _KERNEL
    552 /*
    553  * Private Sun TPI extensions.
    554  */
    555 
    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		*/
    562 };
    563 
    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		*/
    570 };
    571 
    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		*/
    582 };
    583 #endif /* _KERNEL */
    584 
    585 /*
    586  * The following is a union of the primitives
    587  */
    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 */
    625 };
    626 
    627 /*
    628  * TPI specification is not clear on how to pack options in option
    629  * buffers. What follows is the Solaris TPI interpretation of it.
    630  *
    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.
    634  *
    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.
    638  *
    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.
    643  *
    644  * |<--------------first option---------------->|     |<--second option--...
    645  * ______________________________________ _ _ _ ____________________________
    646  * | len | level | name | status |  value.......| / / | len ...
    647  * -------------------------------------- - - - ----------------------------
    648  * |32bit| 32bit |32bit |  32bit |                 ^  | 32bit...
    649  *                                                 |
    650  *                                                 |
    651  *                                        alignment characters
    652  */
    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 */
    659 };
    660 
    661 /*
    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  * ------------------------------------------------------------------------
    669  */
    670 
    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)
    676 
    677 /*
    678  * TPI primitive in message must be aligned at _TPI_ALIGN_SIZE boundary
    679  */
    680 #define	__TPI_PRIM_ISALIGNED(x)	__TPI_SIZE_ISALIGNED(x)
    681 
    682 /*
    683  * TPI option header "struct opthdr" objects must be aligned
    684  * at __TPI_ALIGN_SIZE boundary.
    685  */
    686 #define	__TPI_OPT_ISALIGNED(x)	__TPI_SIZE_ISALIGNED(x)
    687 #define	_TPI_ALIGN_OPT(x)	__TPI_ALIGN(x)
    688 
    689 /*
    690  * TPI option header "struct T_opthdr" objects must be aligned
    691  * at __TPI_ALIGN_SIZE boundary.
    692  */
    693 #define	__TPI_TOPT_ISALIGNED(x)	__TPI_SIZE_ISALIGNED(x)
    694 #define	_TPI_ALIGN_TOPT(x)	__TPI_ALIGN(x)
    695 
    696 /*
    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  * --------------------------------------------------------------------
    704  *
    705  * unsigned char *
    706  * _TPI_TOPT_DATA(struct T_opthdr *tohp):
    707  *      Get start of data part after option header
    708  */
    709 #define	_TPI_TOPT_DATA(tohp)	\
    710 	((unsigned char *)((char *)(tohp) + sizeof (struct T_opthdr)))
    711 
    712 /*
    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).
    717  */
    718 #define	_TPI_TOPT_DATALEN(tohp)	((tohp)->len - sizeof (struct T_opthdr))
    719 
    720 /*
    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
    725  *
    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
    730  *
    731  * Notes:  _TPI_TOPT_NEXTHDR performs the roundup of the length.
    732  *
    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.
    737  */
    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)
    742 
    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)
    748 
    749 /*
    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)
    758  */
    759 
    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)))
    768 
    769 #ifdef __cplusplus
    770 }
    771 #endif
    772 
    773 #endif /* _SYS_TIHDR_H */
    774