docs/how-to-build.md: use proper markup for directory names
[unleashed/tickless.git] / include / sys / tihdr.h
blob089e6ccbfd53b3e6c119f3d9d9fbc7ca96c1002b
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
21 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
22 /* All Rights Reserved */
26 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
29 #ifndef _SYS_TIHDR_H
30 #define _SYS_TIHDR_H
32 #include <sys/types.h>
34 * Include declarations implicit to TPI and shared with user level code
36 #include <sys/tpicommon.h>
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
43 * The feature test macro, _SUN_TPI_VERSION makes some of additional
44 * declarations available and changes some existing ones. There was
45 * some changes done to this interface and this feature test macro
46 * enables transitioning to those changes while maintaining retaining
47 * backward compatibility.
49 * The following is all the information
50 * needed by the Transport Service Interface.
54 * The following are the definitions of the Transport
55 * Service Interface primitives.
59 * Primitives that are initiated by the transport user.
61 #define T_CONN_REQ 0 /* connection request */
62 #if _SUN_TPI_VERSION > 1
63 #define O_T_CONN_RES 1 /* old connection response */
64 #else
65 #define T_CONN_RES 1 /* connection response */
66 #endif /* _SUN_TPI_VERSION > 1 */
67 #define T_DISCON_REQ 2 /* disconnect request */
68 #define T_DATA_REQ 3 /* data request */
69 #define T_EXDATA_REQ 4 /* expedited data request */
70 #define T_INFO_REQ 5 /* information request */
72 * Bind Request primitive (TLI inspired
73 * address binding semantics). If requested address is
74 * found to be busy, an alternative free address is
75 * returned. (Requires comparison of requested address to
76 * returned address to verify if the requested address was
77 * bound)
80 #if _SUN_TPI_VERSION > 0
81 #define O_T_BIND_REQ 6
82 #else
83 #define T_BIND_REQ 6
84 #endif /* _SUN_TPI_VERSION > 0 */
86 #define T_UNBIND_REQ 7 /* unbind request */
87 #define T_UNITDATA_REQ 8 /* unitdata request */
90 * Option management request (with TLI inspired semantics )
91 * The preferred name for this primitive in new code is T_SVR4_OPTMGMT_REQ.
92 * This primitive had the name T_OPTMGMT_REQ in old SVR4 derived TPI.
93 * This primitive is used for TLI and Socket API support.
94 * The packing of options in option buffer is private contract
95 * between transport provider and its users and can differ
96 * between different transports.
97 * (The name O_T_OPTMGMT_REQ continues to exist for Solaris 2.6
98 * compilation environment compatibility only)
101 #define T_SVR4_OPTMGMT_REQ 9
102 #if _SUN_TPI_VERSION > 0
103 #define O_T_OPTMGMT_REQ T_SVR4_OPTMGMT_REQ
104 #else
105 #define T_OPTMGMT_REQ T_SVR4_OPTMGMT_REQ
106 #endif /* _SUN_TPI_VERSION > 0 */
108 #define T_ORDREL_REQ 10 /* orderly release req */
111 * Primitives that are initiated by the transport provider.
113 #define T_CONN_IND 11 /* connection indication */
114 #define T_CONN_CON 12 /* connection confirmation */
115 #define T_DISCON_IND 13 /* disconnect indication */
116 #define T_DATA_IND 14 /* data indication */
117 #define T_EXDATA_IND 15 /* expeditied data indication */
118 #define T_INFO_ACK 16 /* information acknowledgment */
119 #define T_BIND_ACK 17 /* bind acknowledment */
120 #define T_ERROR_ACK 18 /* error acknowledgment */
121 #define T_OK_ACK 19 /* ok acknowledgment */
122 #define T_UNITDATA_IND 20 /* unitdata indication */
123 #define T_UDERROR_IND 21 /* unitdata error indication */
124 #define T_OPTMGMT_ACK 22 /* manage options ack */
125 #define T_ORDREL_IND 23 /* orderly release ind */
127 * Primitives added to namespace and contain a mix of ones
128 * initiated by transport user or provider.
130 #define T_ADDR_REQ 24 /* address request */
131 #define T_ADDR_ACK 25 /* address acknowledgement */
133 #if _SUN_TPI_VERSION > 0
135 * Bind request primitive with better address
136 * binding semantics. (XTI inspired)
137 * If the requested address is found to be busy,
138 * an error is returned. (No need to compare addresses on successful
139 * bind acknowledgement).
141 #define T_BIND_REQ 26 /* bind request */
144 * Option management request (with XTI inspired semantics)
145 * The packing of options in option buffer is required to
146 * be with 'struct T_opthdr' data structure defined later in
147 * this header.
149 #define T_OPTMGMT_REQ 27 /* manage options req - T_opthdr option header */
150 #endif /* _SUN_TPI_VERSION > 0 */
152 #if _SUN_TPI_VERSION > 1
154 * The connection response that expects its ACCEPTOR_id to have been
155 * filled in from the value supplied via a T_CAPABILITY_ACK.
157 #define T_CONN_RES 28 /* connection response */
160 * Capability request and ack. These primitives are optional and
161 * subsume the functionality of T_INFO_{REQ,ACK}.
163 #define T_CAPABILITY_REQ 30
164 #define T_CAPABILITY_ACK 31
165 #endif /* _SUN_TPI_VERSION > 1 */
167 #ifdef _KERNEL
169 * Sun private TPI extensions. They are currently used for transparently
170 * passing options through the connection-oriented loopback transport.
171 * Values assigned to them may change.
173 * T_EXTCONN_IND (extended T_CONN_IND) is used to return dst as well as
174 * src addr/port.
176 #define T_OPTDATA_REQ 0x1001 /* data (with options) request */
177 #define T_OPTDATA_IND 0x1002 /* data (with options) indication */
178 #define T_EXTCONN_IND 0x1003 /* extended T_CONN_IND to return dst as well */
180 #endif /* _KERNEL */
183 * The following are the events that drive the state machine
185 /* Initialization events */
186 #define TE_BIND_REQ 0 /* bind request */
187 #define TE_UNBIND_REQ 1 /* unbind request */
188 #define TE_OPTMGMT_REQ 2 /* manage options req */
189 #define TE_BIND_ACK 3 /* bind acknowledment */
190 #define TE_OPTMGMT_ACK 4 /* manage options ack */
191 #define TE_ERROR_ACK 5 /* error acknowledgment */
192 #define TE_OK_ACK1 6 /* ok ack seqcnt == 0 */
193 #define TE_OK_ACK2 7 /* ok ack seqcnt == 1, q == resq */
194 #define TE_OK_ACK3 8 /* ok ack seqcnt == 1, q != resq */
195 #define TE_OK_ACK4 9 /* ok ack seqcnt > 1 */
197 /* Connection oriented events */
198 #define TE_CONN_REQ 10 /* connection request */
199 #define TE_CONN_RES 11 /* connection response */
200 #define TE_DISCON_REQ 12 /* disconnect request */
201 #define TE_DATA_REQ 13 /* data request */
202 #define TE_EXDATA_REQ 14 /* expedited data request */
203 #define TE_ORDREL_REQ 15 /* orderly release req */
204 #define TE_CONN_IND 16 /* connection indication */
205 #define TE_CONN_CON 17 /* connection confirmation */
206 #define TE_DATA_IND 18 /* data indication */
207 #define TE_EXDATA_IND 19 /* expedited data indication */
208 #define TE_ORDREL_IND 20 /* orderly release ind */
209 #define TE_DISCON_IND1 21 /* disconnect indication seq == 0 */
210 #define TE_DISCON_IND2 22 /* disconnect indication seq == 1 */
211 #define TE_DISCON_IND3 23 /* disconnect indication seq > 1 */
212 #define TE_PASS_CONN 24 /* pass connection */
214 /* Unit data events */
215 #define TE_UNITDATA_REQ 25 /* unitdata request */
216 #define TE_UNITDATA_IND 26 /* unitdata indication */
217 #define TE_UDERROR_IND 27 /* unitdata error indication */
219 #define TE_NOEVENTS 28
221 * The following are the possible states of the Transport
222 * Service Interface
225 #define TS_UNBND 0 /* unbound */
226 #define TS_WACK_BREQ 1 /* waiting ack of BIND_REQ */
227 #define TS_WACK_UREQ 2 /* waiting ack of UNBIND_REQ */
228 #define TS_IDLE 3 /* idle */
229 #define TS_WACK_OPTREQ 4 /* wait ack options request */
230 #define TS_WACK_CREQ 5 /* waiting ack of CONN_REQ */
231 #define TS_WCON_CREQ 6 /* waiting confirm of CONN_REQ */
232 #define TS_WRES_CIND 7 /* waiting response of CONN_IND */
233 #define TS_WACK_CRES 8 /* waiting ack of CONN_RES */
234 #define TS_DATA_XFER 9 /* data transfer */
235 #define TS_WIND_ORDREL 10 /* releasing rd but not wr */
236 #define TS_WREQ_ORDREL 11 /* wait to release wr but not rd */
237 #define TS_WACK_DREQ6 12 /* waiting ack of DISCON_REQ */
238 #define TS_WACK_DREQ7 13 /* waiting ack of DISCON_REQ */
239 #define TS_WACK_DREQ9 14 /* waiting ack of DISCON_REQ */
240 #define TS_WACK_DREQ10 15 /* waiting ack of DISCON_REQ */
241 #define TS_WACK_DREQ11 16 /* waiting ack of DISCON_REQ */
243 #define TS_NOSTATES 17
247 * The following structure definitions define the format of the
248 * stream message block of the above primitives.
249 * (everything is declared t_scalar_t to ensure proper alignment
250 * across different machines)
253 /* connection request */
255 struct T_conn_req {
256 t_scalar_t PRIM_type; /* always T_CONN_REQ */
257 t_scalar_t DEST_length; /* dest addr length */
258 t_scalar_t DEST_offset; /* dest addr offset */
259 t_scalar_t OPT_length; /* options length */
260 t_scalar_t OPT_offset; /* options offset */
263 /* connect response */
266 * Historical compatibility note for "struct T_conn_res" usage.
267 * "QUEUE_ptr" field of type "queue_t" is obsolete to support
268 * code portability and application binary compatibility
269 * between ILP32(32-bit) and LP64 (64-bit) environments.
270 * Use field "ACCEPTOR_id" instead.
271 * For compatibility, drivers using (_SUN_TPI_VERSION >= 2) interface
272 * can support treating ACCEPTOR_id content as queue pointer
273 * only when PRIM_type is O_T_CONN_RES.
275 struct T_conn_res {
276 t_scalar_t PRIM_type; /* T_CONN_RES (or O_T_CONN_RES) */
277 t_uscalar_t ACCEPTOR_id; /* id of accepting endpoint */
278 t_scalar_t OPT_length; /* options length */
279 t_scalar_t OPT_offset; /* options offset */
280 t_scalar_t SEQ_number; /* sequence number */
283 /* disconnect request */
285 struct T_discon_req {
286 t_scalar_t PRIM_type; /* always T_DISCON_REQ */
287 t_scalar_t SEQ_number; /* sequnce number */
290 /* data request */
292 struct T_data_req {
293 t_scalar_t PRIM_type; /* always T_DATA_REQ */
294 t_scalar_t MORE_flag; /* more data */
297 /* expedited data request */
299 struct T_exdata_req {
300 t_scalar_t PRIM_type; /* always T_EXDATA_REQ */
301 t_scalar_t MORE_flag; /* more data */
304 /* information request */
306 struct T_info_req {
307 t_scalar_t PRIM_type; /* always T_INFO_REQ */
310 /* bind request */
312 struct T_bind_req {
313 t_scalar_t PRIM_type; /* T_BIND_REQ (or O_T_BIND_REQ) */
314 t_scalar_t ADDR_length; /* addr length */
315 t_scalar_t ADDR_offset; /* addr offset */
316 t_uscalar_t CONIND_number; /* connect indications requested */
319 /* unbind request */
321 struct T_unbind_req {
322 t_scalar_t PRIM_type; /* always T_UNBIND_REQ */
325 /* unitdata request */
327 struct T_unitdata_req {
328 t_scalar_t PRIM_type; /* always T_UNITDATA_REQ */
329 t_scalar_t DEST_length; /* dest addr length */
330 t_scalar_t DEST_offset; /* dest addr offset */
331 t_scalar_t OPT_length; /* options length */
332 t_scalar_t OPT_offset; /* options offset */
335 /* manage options request */
337 struct T_optmgmt_req {
338 t_scalar_t PRIM_type; /* T_OPTMGMT_REQ or */
339 /* T_SVR4_OPTMGMT_REQ */
340 t_scalar_t OPT_length; /* options length */
341 t_scalar_t OPT_offset; /* options offset */
342 t_scalar_t MGMT_flags; /* options flags */
345 /* orderly release request */
347 struct T_ordrel_req {
348 t_scalar_t PRIM_type; /* always T_ORDREL_REQ */
351 /* protocol address request */
353 struct T_addr_req {
354 t_scalar_t PRIM_type; /* always T_ADDR_REQ */
357 /* connect indication */
359 struct T_conn_ind {
360 t_scalar_t PRIM_type; /* always T_CONN_IND */
361 t_scalar_t SRC_length; /* src addr length */
362 t_scalar_t SRC_offset; /* src addr offset */
363 t_scalar_t OPT_length; /* option length */
364 t_scalar_t OPT_offset; /* option offset */
365 t_scalar_t SEQ_number; /* sequnce number */
368 /* connect confirmation */
370 struct T_conn_con {
371 t_scalar_t PRIM_type; /* always T_CONN_CON */
372 t_scalar_t RES_length; /* responding addr length */
373 t_scalar_t RES_offset; /* responding addr offset */
374 t_scalar_t OPT_length; /* option length */
375 t_scalar_t OPT_offset; /* option offset */
378 /* disconnect indication */
380 struct T_discon_ind {
381 t_scalar_t PRIM_type; /* always T_DISCON_IND */
382 t_scalar_t DISCON_reason; /* disconnect reason */
383 t_scalar_t SEQ_number; /* sequnce number */
386 /* data indication */
388 struct T_data_ind {
389 t_scalar_t PRIM_type; /* always T_DATA_IND */
390 t_scalar_t MORE_flag; /* more data */
393 /* expedited data indication */
395 struct T_exdata_ind {
396 t_scalar_t PRIM_type; /* always T_EXDATA_IND */
397 t_scalar_t MORE_flag; /* more data */
400 /* information acknowledgment */
402 struct T_info_ack {
403 t_scalar_t PRIM_type; /* always T_INFO_ACK */
404 t_scalar_t TSDU_size; /* max TSDU size */
405 t_scalar_t ETSDU_size; /* max ETSDU size */
406 t_scalar_t CDATA_size; /* max connect data size */
407 t_scalar_t DDATA_size; /* max discon data size */
408 t_scalar_t ADDR_size; /* address size */
409 t_scalar_t OPT_size; /* options size */
410 t_scalar_t TIDU_size; /* max TIDU size */
411 t_scalar_t SERV_type; /* provider service type */
412 t_scalar_t CURRENT_state; /* current state */
413 t_scalar_t PROVIDER_flag; /* provider flags */
417 * The following are definitions of flags available to the transport
418 * provider to set in the PROVIDER_flag field of the T_info_ack
419 * structure.
422 #if _SUN_TPI_VERSION > 0
423 #define SENDZERO 0x0001 /* provider can handle --length TSDUs */
425 #define OLD_SENDZERO 0x1000 /* reserved for compatibility with */
426 /* old providers- old value of */
427 /* SENDZERO defined in <sys/timod.h> */
428 #else
429 #define SENDZERO 0x1000 /* old SENDZERO value */
430 #endif /* _SUN_TPI_VERSION > 0 */
432 #define EXPINLINE 0x0002 /* provider wants ETSDUs in band 0 */
434 * Flag XPG4_1:
435 * transport provider supports TPI modifications motivated by and
436 * in conjunction with XTI inspired TPI support and all the
437 * compatibility baggage that implies.
438 * It implies, - primitives T_ADDR_REQ & T_ADDR_ACK supported
439 * - primitives O_T_BIND_REQ & T_BIND_REQ separately supported
440 * - primitives T_SVR4_OPTMGMT_REQ & T_OPTMGMT_REQ separately
441 * supported.
443 #define XPG4_1 0x0004
445 /* bind acknowledgment */
447 struct T_bind_ack {
448 t_scalar_t PRIM_type; /* always T_BIND_ACK */
449 t_scalar_t ADDR_length; /* addr length */
450 t_scalar_t ADDR_offset; /* addr offset */
451 t_uscalar_t CONIND_number; /* connect ind to be queued */
454 /* error acknowledgment */
456 struct T_error_ack {
457 t_scalar_t PRIM_type; /* always T_ERROR_ACK */
458 t_scalar_t ERROR_prim; /* primitive in error */
459 t_scalar_t TLI_error; /* TLI error code */
460 t_scalar_t UNIX_error; /* UNIX error code */
463 /* ok acknowledgment */
465 struct T_ok_ack {
466 t_scalar_t PRIM_type; /* always T_OK_ACK */
467 t_scalar_t CORRECT_prim; /* correct primitive */
470 /* unitdata indication */
472 struct T_unitdata_ind {
473 t_scalar_t PRIM_type; /* always T_UNITDATA_IND */
474 t_scalar_t SRC_length; /* source addr length */
475 t_scalar_t SRC_offset; /* source addr offset */
476 t_scalar_t OPT_length; /* options length */
477 t_scalar_t OPT_offset; /* options offset */
480 /* unitdata error indication */
482 struct T_uderror_ind {
483 t_scalar_t PRIM_type; /* always T_UDERROR_IND */
484 t_scalar_t DEST_length; /* dest addr length */
485 t_scalar_t DEST_offset; /* dest addr offset */
486 t_scalar_t OPT_length; /* options length */
487 t_scalar_t OPT_offset; /* options offset */
488 t_scalar_t ERROR_type; /* error type */
491 /* manage options ack */
493 struct T_optmgmt_ack {
494 t_scalar_t PRIM_type; /* always T_OPTMGMT_ACK */
495 t_scalar_t OPT_length; /* options length */
496 t_scalar_t OPT_offset; /* options offset */
497 t_scalar_t MGMT_flags; /* managment flags */
500 /* orderly release indication */
502 struct T_ordrel_ind {
503 t_scalar_t PRIM_type; /* always T_ORDREL_IND */
507 /* protocol address acknowledgment */
509 struct T_addr_ack {
510 t_scalar_t PRIM_type; /* always T_ADDR_ACK */
511 t_scalar_t LOCADDR_length; /* length of local address */
512 t_scalar_t LOCADDR_offset; /* offset of local address */
513 t_scalar_t REMADDR_length; /* length of remote address */
514 t_scalar_t REMADDR_offset; /* offset of remote address */
517 #if _SUN_TPI_VERSION > 1
519 * Capability request and ack. These primitives are optional and
520 * subsume the functionality of T_INFO_{REQ,ACK}.
522 struct T_capability_req {
523 t_scalar_t PRIM_type; /* always T_CAPABILITY_REQ */
524 t_uscalar_t CAP_bits1; /* capability bits #1 */
527 struct T_capability_ack {
528 t_scalar_t PRIM_type; /* always T_CAPABILITY_ACK */
529 t_uscalar_t CAP_bits1; /* capability bits #1 */
530 struct T_info_ack
531 INFO_ack; /* info acknowledgement */
532 t_uscalar_t ACCEPTOR_id; /* accepting endpoint id */
535 #define TC1_INFO (1u << 0) /* Info request/ack */
536 #define TC1_ACCEPTOR_ID (1u << 1) /* Acceptor_id request/ack */
537 #define TC1_CAP_BITS2 (1u << 31) /* Reserved for future use */
539 #endif /* _SUN_TPI_VERSION > 1 */
541 #ifdef _KERNEL
543 * Private Sun TPI extensions.
546 /* data (with options) request */
547 struct T_optdata_req {
548 t_scalar_t PRIM_type; /* always T_OPTDATA_REQ */
549 t_scalar_t DATA_flag; /* flags like "more data" */
550 t_scalar_t OPT_length; /* options length */
551 t_scalar_t OPT_offset; /* options offset */
554 /* data (with options) indication */
555 struct T_optdata_ind {
556 t_scalar_t PRIM_type; /* always T_OPTDATA_IND */
557 t_scalar_t DATA_flag; /* flags like "more data" */
558 t_scalar_t OPT_length; /* options length */
559 t_scalar_t OPT_offset; /* options offset */
562 /* extended connect indication to return dst addr/port as well as src */
563 struct T_extconn_ind {
564 t_scalar_t PRIM_type; /* always T_EXTCONN_IND */
565 t_scalar_t SRC_length; /* src addr length */
566 t_scalar_t SRC_offset; /* src addr offset */
567 t_scalar_t OPT_length; /* option length */
568 t_scalar_t OPT_offset; /* option offset */
569 t_scalar_t SEQ_number; /* sequnce number */
570 t_scalar_t DEST_length; /* dest addr length */
571 t_scalar_t DEST_offset; /* dest addr offset */
573 #endif /* _KERNEL */
576 * The following is a union of the primitives
578 union T_primitives {
579 t_scalar_t type; /* primitive type */
580 struct T_conn_req conn_req; /* connect request */
581 struct T_conn_res conn_res; /* connect response */
582 struct T_discon_req discon_req; /* disconnect request */
583 struct T_data_req data_req; /* data request */
584 struct T_exdata_req exdata_req; /* expedited data req */
585 struct T_info_req info_req; /* information req */
586 struct T_bind_req bind_req; /* bind request */
587 struct T_unbind_req unbind_req; /* unbind request */
588 struct T_unitdata_req unitdata_req; /* unitdata requset */
589 struct T_optmgmt_req optmgmt_req; /* manage opt req */
590 struct T_ordrel_req ordrel_req; /* orderly rel req */
591 struct T_addr_req addr_req; /* address request */
592 struct T_conn_ind conn_ind; /* connect indication */
593 struct T_conn_con conn_con; /* connect corfirm */
594 struct T_discon_ind discon_ind; /* discon indication */
595 struct T_data_ind data_ind; /* data indication */
596 struct T_exdata_ind exdata_ind; /* expedited data ind */
597 struct T_info_ack info_ack; /* info ack */
598 struct T_bind_ack bind_ack; /* bind ack */
599 struct T_error_ack error_ack; /* error ack */
600 struct T_ok_ack ok_ack; /* ok ack */
601 struct T_unitdata_ind unitdata_ind; /* unitdata ind */
602 struct T_uderror_ind uderror_ind; /* unitdata error ind */
603 struct T_optmgmt_ack optmgmt_ack; /* manage opt ack */
604 struct T_ordrel_ind ordrel_ind; /* orderly rel ind */
605 struct T_addr_ack addr_ack; /* address ack */
606 #if _SUN_TPI_VERSION > 1
607 struct T_capability_req capability_req; /* capability req */
608 struct T_capability_ack capability_ack; /* capability ack */
609 #endif /* _SUN_TPI_VERSION > 1 */
610 #ifdef _KERNEL
611 struct T_optdata_req optdata_req; /* option data request */
612 struct T_optdata_ind optdata_ind; /* option data ind */
613 struct T_extconn_ind extconn_ind; /* above plus dst addr */
614 #endif /* _KERNEL */
618 * TPI specification is not clear on how to pack options in option
619 * buffers. What follows is the Solaris TPI interpretation of it.
621 * struct T_opthdr data structure is used to pack options in T_OPTMGMT_{REQ,ACK}
622 * message primitives in buffer delimited by [OPT_offset, OPT_length] fields in
623 * struct T_optmgmt_req/T_optmgmt_ack data structures.
625 * It is also used to pack options in similar buffers for data structures in
626 * T_CONN_{REQ,IND,RES,CONN} primitives and T_UNITDATA_{REQ,IND} primitives
627 * Needs to be on t_uscalar_t (32-bit word) aligned boundary.
629 * Note: T_SVR4_OPTMGMT_REQ primitive can, but need not, use this data
630 * structure for packing options. The format of option buffer for
631 * T_SVR4_OPTMGMT_REQ primitive is undefined and is a private contract
632 * between transport provider and its users.
634 * |<--------------first option---------------->| |<--second option--...
635 * ______________________________________ _ _ _ ____________________________
636 * | len | level | name | status | value.......| / / | len ...
637 * -------------------------------------- - - - ----------------------------
638 * |32bit| 32bit |32bit | 32bit | ^ | 32bit...
641 * alignment characters
643 struct T_opthdr {
644 t_uscalar_t len; /* total length of option (header+value) */
645 t_uscalar_t level; /* protocol level */
646 t_uscalar_t name; /* option name */
647 t_uscalar_t status; /* status value */
648 /* option value aligned on t_uscalar_t (32-bit) alignment boundary */
652 * ------------------------------------------------------------------------
653 * Common experimental private TPI alignment related macros. Not for
654 * use outside Solaris bundled code and can change in any release.
655 * The alignment boundary _TPI_ALIGN_SIZE represents an implementation
656 * choice for aligning many data objects which are directly or indirectly
657 * associated with Solaris TPI implementation.
658 * ------------------------------------------------------------------------
661 #define __TPI_ALIGN_SIZE (sizeof (t_scalar_t))
662 #define __TPI_ALIGN(x) \
663 (((uintptr_t)(x) + __TPI_ALIGN_SIZE - 1) & ~(__TPI_ALIGN_SIZE - 1))
664 #define __TPI_SIZE_ISALIGNED(x) \
665 (((uintptr_t)(x) & (__TPI_ALIGN_SIZE - 1)) == 0)
668 * TPI primitive in message must be aligned at _TPI_ALIGN_SIZE boundary
670 #define __TPI_PRIM_ISALIGNED(x) __TPI_SIZE_ISALIGNED(x)
673 * TPI option header "struct opthdr" objects must be aligned
674 * at __TPI_ALIGN_SIZE boundary.
676 #define __TPI_OPT_ISALIGNED(x) __TPI_SIZE_ISALIGNED(x)
677 #define _TPI_ALIGN_OPT(x) __TPI_ALIGN(x)
680 * TPI option header "struct T_opthdr" objects must be aligned
681 * at __TPI_ALIGN_SIZE boundary.
683 #define __TPI_TOPT_ISALIGNED(x) __TPI_SIZE_ISALIGNED(x)
684 #define _TPI_ALIGN_TOPT(x) __TPI_ALIGN(x)
687 * --------------------------------------------------------------------
688 * Private experimental macros. Not for use outside Solaris bundled
689 * source code and can change in any release.
690 * Macros that operate on struct T_opthdr. These are roughly modelled
691 * after the corresponding Socket CMSG_*() and XTI T_OPT_*() macros, but
692 * are applied to TPI option buffers.
693 * --------------------------------------------------------------------
695 * unsigned char *
696 * _TPI_TOPT_DATA(struct T_opthdr *tohp):
697 * Get start of data part after option header
699 #define _TPI_TOPT_DATA(tohp) \
700 ((unsigned char *)((char *)(tohp) + sizeof (struct T_opthdr)))
703 * t_uscalar_t
704 * _TPI_TOPT_DATALEN(tohp)
705 * Get length of contents of option data excluding header (and
706 * padding etc if any).
708 #define _TPI_TOPT_DATALEN(tohp) ((tohp)->len - sizeof (struct T_opthdr))
711 * struct T_opthdr *
712 * _TPI_TOPT_FIRSTHDR(char *pbuf, t_scalar_t buflen):
713 * Get pointer to the first option header in buffer 'pbuf'
714 * Return NULL if there is not enough room for the header
716 * struct T_opthdr *
717 * _TPI_TOPT_NEXTHDR(char *pbuf, t_scalar_t buflen,
718 * struct T_opthdr *popt):
719 * Skip to next option header
721 * Notes: _TPI_TOPT_NEXTHDR performs the roundup of the length.
723 * If _TPI_TOPT_{FIRST,NEXT}HDR returns a non-null value, the user of
724 * _TPI_TOPT_{FIRST,NEXT}HDR must still verify that the resulting pointer
725 * is valid, by making a call to _TPI_TOPT_VALID. The _TPI_TOPT_VALID
726 * macro does not assume that the last option buffer is padded.
728 #define _TPI_TOPT_FIRSTHDR(pbuf, buflen) \
729 ((((buflen) >= (unsigned int) sizeof (struct T_opthdr)) && \
730 __TPI_TOPT_ISALIGNED(pbuf)) ? \
731 (struct T_opthdr *)(pbuf) : NULL)
733 #define _TPI_TOPT_NEXTHDR(pbuf, buflen, popt) \
734 (((char *)(popt) + _TPI_ALIGN_TOPT((popt)->len)) < \
735 ((char *)(pbuf) + (buflen)) ? \
736 (struct T_opthdr *)((char *)(popt) + _TPI_ALIGN_TOPT((popt)->len)) : \
737 NULL)
740 * bool_t
741 * _TPI_TOPT_VALID(struct T_opthdr *tohp, char *start, char *end)
742 * Validate the option header at tohp, for its alignment and length.
743 * 1. check that tohp is aligned at t_scalar_t boundary
744 * 2. check that start <= tohp < end
745 * 3. validate the length, should be >= sizeof(T_opthdr) and
746 * check that there is no pointer arithmetic overflow.
747 * (could be caused by a very large value for tohp->len)
750 #define _TPI_TOPT_VALID(tohp, start, end) \
751 (__TPI_TOPT_ISALIGNED(tohp) && \
752 ((uintptr_t)(tohp) >= (uintptr_t)(start)) && \
753 ((uintptr_t)(tohp) < (uintptr_t)(end)) && \
754 ((ssize_t)(tohp)->len >= sizeof (struct T_opthdr)) && \
755 ((uintptr_t)(tohp) + (tohp)->len <= (uintptr_t)(end)) && \
756 ((uintptr_t)(tohp) + (tohp)->len >= (uintptr_t)(tohp) + \
757 sizeof (struct T_opthdr)))
759 #ifdef __cplusplus
761 #endif
763 #endif /* _SYS_TIHDR_H */