xref: /illumos-gate/usr/src/head/xti.h (revision 8b80e8cb6855118d46f605e91b5ed4ce83417395)
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) 1996 Sun Microsystems, Inc.	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 #ifndef _XTI_H
27 #define	_XTI_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #include <sys/types.h>
32 
33 /*
34  * The following include file has declarations needed by both the kernel
35  * level transport providers and the user level library. This file includes
36  * it to expose its namespaces to XTI user level interface.
37  */
38 #include <sys/tpicommon.h>
39 
40 /*
41  * Include XTI interface level options management declarations
42  */
43 #include <sys/xti_xtiopt.h>
44 
45 #if !defined(_XPG5)
46 
47 /*
48  * Include declarations related to OSI transport and management data
49  * structures, and the Internet Protocol Suite.
50  * Note: The older Unix95/XNS4 XTI spec required these to be
51  * exposed through the generic interface header.
52  */
53 #include <sys/xti_osi.h>
54 #include <sys/xti_inet.h>
55 
56 #endif /* !defined(_XPG5) */
57 
58 #ifdef	__cplusplus
59 extern "C" {
60 #endif
61 
62 /*
63  * The following t_errno error codes are included in the namespace by
64  * inclusion of <sys/tpicommon.h> above. The english language error strings
65  * associated with the error values are reproduced here for easy reference.
66  *
67  * Error		Value	Error message string
68  * ----			-----	--------------------
69  * TBADADDR		1	Incorrect address format
70  * TBADOPT		2	Incorrect options format
71  * TACCES		3	Illegal permissions
72  * TBADF		4	Illegal file descriptor
73  * TNOADDR		5	Couldn't allocate address
74  * TOUTSTATE		6	Routine will place interface out of state
75  * TBADSEQ		7	Illegal called/calling sequence number
76  * TSYSERR		8	System error
77  * TLOOK		9	An event requires attention
78  * TBADDATA		10	Illegal amount of data
79  * TBUFOVFLW		11	Buffer not large enough
80  * TFLOW		12	Can't send message - (blocked)
81  * TNODATA		13	No message currently available
82  * TNODIS		14	Disconnect message not found
83  * TNOUDERR		15	Unitdata error message not found
84  * TBADFLAG		16	Incorrect flags specified
85  * TNOREL		17	Orderly release message not found
86  * TNOTSUPPORT		18	Primitive not supported by provider
87  * TSTATECHNG		19	State is in process of changing
88  * TNOSTRUCTYPE		20	Unsupported structure type requested
89  * TBADNAME		21	Invalid transport provider name
90  * TBADQLEN		22	Listener queue length limit is zero
91  * TADDRBUSY		23	Transport address is in use
92  * TINDOUT		24	Outstanding connection indications
93  * TPROVMISMATCH	25	Listener-acceptor transport provider mismatch
94  * TRESQLEN		26	Connection acceptor has listen queue length
95  *				limit greater than zero
96  * TRESADDR		27	Connection acceptor-listener addresses not
97  *				same but required by transport
98  * TQFULL		28	Incoming connection queue is full
99  * TPROTO		29	Protocol error on transport primitive
100  *
101  */
102 
103 /*
104  * The following are the events returned by t_look
105  */
106 #define	T_LISTEN	0x0001	/* connection indication received	*/
107 #define	T_CONNECT	0x0002	/* connect confirmation received	*/
108 #define	T_DATA		0x0004	/* normal data received			*/
109 #define	T_EXDATA	0x0008	/* expedited data received		*/
110 #define	T_DISCONNECT	0x0010	/* disconnect received			*/
111 #define	T_UDERR		0x0040	/* data gram error indication		*/
112 #define	T_ORDREL	0x0080	/* orderly release indication		*/
113 #define	T_GODATA	0x0100	/* sending normal data is again possible */
114 #define	T_GOEXDATA	0x0200	/* sending expedited data is again possible */
115 
116 /*
117  * Flags for data primitives
118  */
119 #define	T_MORE		0x001	/* more data		*/
120 #define	T_EXPEDITED	0x002	/* expedited data	*/
121 #define	T_PUSH		0x004	/* send data immediately */
122 
123 /*
124  * XTI error return
125  */
126 #if defined(_REENTRANT) || defined(_TS_ERRNO)
127 extern int	*__t_errno();
128 #define	t_errno (*(__t_errno()))
129 #else
130 extern int t_errno;
131 #endif	/* defined(_REENTRANT) || defined(_TS_ERRNO) */
132 
133 
134 /*
135  * The following are for t_sysconf()
136  */
137 #ifndef T_IOV_MAX
138 #define	T_IOV_MAX	16	/* Maximum number of scatter/gather buffers */
139 #endif				/* Should be <= IOV_MAX */
140 
141 #ifndef _SC_T_IOV_MAX
142 #define	_SC_T_IOV_MAX 	79	/* Should be same in <unistd.h> for use by */
143 #endif				/* sysconf() */
144 
145 struct t_iovec {
146 	void	*iov_base;
147 	size_t	iov_len;
148 };
149 
150 /*
151  * Translate source level interface to binary entry point names.
152  *
153  * Note: This is done to maintain co-existence of TLI and XTI
154  * interfaces which have identical names for most functions but
155  * different semantics. The XTI names are moved to the different
156  * prefix space in the ABI. The #ifdef is required to make use of
157  * of the compiler feature to allow redefinition of external names
158  * where available. Otherwise a simple #define is used when this
159  * header is used with other compilers.
160  * The use of #define also has the effect of renaming all names (not
161  * just function names) to the new name. The TLI function names
162  * (e.g. t_bind) can have identical names for structure names
163  * (e.g struct t_bind). Therefore, this redefinition of names needs
164  * to be before all structure and function name declarations in the header.
165  */
166 
167 #ifdef __PRAGMA_REDEFINE_EXTNAME
168 
169 #if defined(_XOPEN_SOURCE) && !defined(_XPG5)
170 #pragma redefine_extname t_accept	_xti_accept
171 #else
172 #pragma redefine_extname t_accept	_xti_xns5_accept
173 #endif
174 #pragma redefine_extname t_alloc	_xti_alloc
175 #pragma redefine_extname t_bind		_xti_bind
176 #pragma redefine_extname t_close	_xti_close
177 #pragma redefine_extname t_connect	_xti_connect
178 #pragma redefine_extname t_error	_xti_error
179 #pragma redefine_extname t_free		_xti_free
180 #pragma redefine_extname t_getinfo	_xti_getinfo
181 #pragma redefine_extname t_getstate	_xti_getstate
182 #pragma redefine_extname t_getprotaddr	_xti_getprotaddr
183 #pragma redefine_extname t_listen	_xti_listen
184 #pragma redefine_extname t_look		_xti_look
185 #pragma redefine_extname t_open		_xti_open
186 #pragma redefine_extname t_optmgmt	_xti_optmgmt
187 #pragma redefine_extname t_rcv		_xti_rcv
188 #pragma redefine_extname t_rcvconnect	_xti_rcvconnect
189 #pragma redefine_extname t_rcvdis	_xti_rcvdis
190 #pragma redefine_extname t_rcvrel	_xti_rcvrel
191 #pragma redefine_extname t_rcvreldata	_xti_rcvreldata
192 #pragma redefine_extname t_rcvudata	_xti_rcvudata
193 #pragma redefine_extname t_rcvuderr	_xti_rcvuderr
194 #pragma redefine_extname t_rcvv		_xti_rcvv
195 #pragma redefine_extname t_rcvvudata	_xti_rcvvudata
196 #if defined(_XOPEN_SOURCE) && !defined(_XPG5)
197 #pragma redefine_extname t_snd		_xti_snd
198 #else
199 #pragma redefine_extname t_snd		_xti_xns5_snd
200 #endif
201 #pragma redefine_extname t_snddis	_xti_snddis
202 #pragma redefine_extname t_sndrel	_xti_sndrel
203 #pragma redefine_extname t_sndreldata	_xti_sndreldata
204 #pragma redefine_extname t_sndudata	_xti_sndudata
205 #pragma redefine_extname t_sndv		_xti_sndv
206 #pragma redefine_extname t_sndvudata	_xti_sndvudata
207 #pragma redefine_extname t_strerror	_xti_strerror
208 #pragma redefine_extname t_sync		_xti_sync
209 #pragma redefine_extname t_sysconf	_xti_sysconf
210 #pragma redefine_extname t_unbind	_xti_unbind
211 
212 #else /* __PRAGMA_REDEFINE_EXTNAME */
213 
214 #if defined(_XOPEN_SOURCE) && !defined(_XPG5)
215 #define	t_accept	_xti_accept
216 #else
217 #define	t_accept	_xti_xns5_accept
218 #endif
219 #define	t_alloc		_xti_alloc
220 #define	t_bind		_xti_bind
221 #define	t_close		_xti_close
222 #define	t_connect	_xti_connect
223 #define	t_error		_xti_error
224 #define	t_free		_xti_free
225 #define	t_getinfo	_xti_getinfo
226 #define	t_getstate	_xti_getstate
227 #define	t_getprotaddr	_xti_getprotaddr
228 #define	t_listen	_xti_listen
229 #define	t_look		_xti_look
230 #define	t_open		_xti_open
231 #define	t_optmgmt	_xti_optmgmt
232 #define	t_rcv		_xti_rcv
233 #define	t_rcvconnect	_xti_rcvconnect
234 #define	t_rcvdis	_xti_rcvdis
235 #define	t_rcvrel	_xti_rcvrel
236 #define	t_rcvreldata	_xti_rcvreldata
237 #define	t_rcvudata	_xti_rcvudata
238 #define	t_rcvuderr	_xti_rcvuderr
239 #define	t_rcvv		_xti_rcvv
240 #define	t_rcvvudata	_xti_rcvvudata
241 #if defined(_XOPEN_SOURCE) && !defined(_XPG5)
242 #define	t_snd		_xti_snd
243 #else
244 #define	t_snd		_xti_xns5_snd
245 #endif
246 #define	t_snddis	_xti_snddis
247 #define	t_sndrel	_xti_sndrel
248 #define	t_sndreldata	_xti_sndreldata
249 #define	t_sndudata	_xti_sndudata
250 #define	t_sndv		_xti_sndv
251 #define	t_sndvudata	_xti_sndvudata
252 #define	t_strerror	_xti_strerror
253 #define	t_sync		_xti_sync
254 #define	t_sysconf	_xti_sysconf
255 #define	t_unbind	_xti_unbind
256 
257 #endif /* __PRAGMA_REDEFINE_EXTNAME */
258 
259 /*
260  * protocol specific service limits
261  */
262 struct t_info {
263 	t_scalar_t addr;	/* max size of protocol address		*/
264 	t_scalar_t options;	/* max size of protocol options		*/
265 	t_scalar_t tsdu;	/* max size of max transport service	*/
266 				/* data unit	*/
267 	t_scalar_t etsdu;	/* max size of max expedited tsdu	*/
268 	t_scalar_t connect;	/* max data for connection primitives	*/
269 	t_scalar_t discon;	/* max data for disconnect primitives	*/
270 	t_scalar_t servtype;	/* provider service type		*/
271 	t_scalar_t flags;	/* other info about transport providers	*/
272 };
273 
274 /*
275  * Flags definitions for the t_info structure
276  */
277 #define	T_SENDZERO	0x001	/* supports 0-length TSDUs */
278 #define	T_ORDRELDATA	0x002	/* supports orderly release data */
279 
280 /*
281  * netbuf structure
282  */
283 struct netbuf {
284 	unsigned int maxlen;
285 	unsigned int len;
286 #if defined(_XPG5)
287 	void *buf;
288 #else
289 	char *buf;
290 #endif
291 };
292 
293 /*
294  * t_opthdr structure
295  */
296 struct t_opthdr {
297 	t_uscalar_t	len;	/* total length of option */
298 	t_uscalar_t	level;	/* protocol level */
299 	t_uscalar_t	name;	/* option name */
300 	t_uscalar_t	status;	/* status value */
301 	/* followed by option value */
302 };
303 
304 /*
305  * t_bind - format of the addres and options arguments of bind
306  */
307 
308 struct t_bind {
309 	struct netbuf	addr;
310 	unsigned int	qlen;
311 };
312 
313 /*
314  * options management
315  */
316 struct t_optmgmt {
317 	struct netbuf	opt;
318 	t_scalar_t	flags;
319 };
320 
321 /*
322  * disconnect structure
323  */
324 struct t_discon {
325 	struct netbuf	udata;		/* user data		*/
326 	int		reason;		/* reason code		*/
327 	int		sequence;	/* sequence number	*/
328 };
329 
330 /*
331  * call structure
332  */
333 struct t_call {
334 	struct netbuf	addr;		/*  address		*/
335 	struct netbuf	opt;		/* options		*/
336 	struct netbuf	udata;		/* user data		*/
337 	int		sequence;	/* sequence number	*/
338 };
339 
340 /*
341  * data gram structure
342  */
343 struct t_unitdata {
344 	struct netbuf	addr;		/*  address		*/
345 	struct netbuf	opt;		/* options		*/
346 	struct netbuf	udata;		/* user data		*/
347 };
348 
349 /*
350  * unitdata error
351  */
352 struct t_uderr {
353 	struct netbuf	addr;		/* address		*/
354 	struct netbuf	opt;		/* options 		*/
355 	t_scalar_t	error;		/* error code		*/
356 };
357 
358 /*
359  * The following are structure types used when dynamically
360  * allocating the above structures via t_structalloc().
361  */
362 #define	T_BIND		1		/* struct t_bind	*/
363 #define	T_OPTMGMT	2		/* struct t_optmgmt	*/
364 #define	T_CALL		3		/* struct t_call	*/
365 #define	T_DIS		4		/* struct t_discon	*/
366 #define	T_UNITDATA	5		/* struct t_unitdata	*/
367 #define	T_UDERROR	6		/* struct t_uderr	*/
368 #define	T_INFO		7		/* struct t_info	*/
369 
370 /*
371  * The following bits specify which fields of the above
372  * structures should be allocated by t_alloc().
373  */
374 #define	T_ADDR	0x01			/* address		*/
375 #define	T_OPT	0x02			/* options		*/
376 #define	T_UDATA	0x04			/* user data		*/
377 #define	T_ALL	0xffff			/* all the above fields */
378 
379 
380 /*
381  * the following are the states for the user
382  */
383 
384 #define	T_UNINIT	0		/* uninitialized		*/
385 #define	T_UNBND		1		/* unbound			*/
386 #define	T_IDLE		2		/* idle				*/
387 #define	T_OUTCON	3		/* outgoing connection pending 	*/
388 #define	T_INCON		4		/* incoming connection pending	*/
389 #define	T_DATAXFER	5		/* data transfer		*/
390 #define	T_OUTREL	6		/* outgoing release pending	*/
391 #define	T_INREL		7		/* incoming release pending	*/
392 
393 
394 #define	T_UNUSED		-1
395 #define	T_NULL			0
396 
397 
398 /*
399  * Allegedly general purpose constant. Used with (and needs to be bitwise
400  * distinct from) T_NOPROTECT, T_PASSIVEPROTECT and T_ACTIVEPROTECT
401  * which are OSI specific constants but part of this header (defined
402  * in <xti_osi.h> which is included in this header for historical
403  * XTI specification reasons)
404  */
405 #define	T_ABSREQ		0x8000
406 
407 /*
408  * General definitions for option management
409  *
410  * Multiple variable length options may be packed into a single option buffer.
411  * Each option consists of a fixed length header followed by variable length
412  * data. The header and data will have to be aligned at appropriate
413  * boundaries. The following macros are used to manipulate the options.
414  *
415  * Helper Macros: Macros beginning with a "_T" prefix are helper macros.
416  *		  They are private, not meant for public use and may
417  *		  change without notice. Users  should use the standard
418  *		  XTI macros beginning with "T_" prefix
419  */
420 
421 #define	_T_OPT_HALIGN_SZ	(sizeof (t_scalar_t)) /* Hdr Alignment size  */
422 #define	_T_OPT_DALIGN_SZ	(sizeof (int32_t))    /* Data Alignment size */
423 #define	_T_OPTHDR_SZ	(sizeof (struct t_opthdr))
424 
425 /* Align 'x' to the next 'asize' alignment  boundary */
426 #define	_T_OPT_ALIGN(x, asize) \
427 	(((uintptr_t)(x) + ((asize) - 1L)) & ~((asize) - 1L))
428 
429 /* Align 'x' to the next header alignment  boundary */
430 #define	_T_OPTHDR_ALIGN(x) \
431 	(_T_OPT_ALIGN((x), _T_OPT_HALIGN_SZ))
432 
433 /* Align 'x' to the next data alignment  boundary */
434 #define	_T_OPTDATA_ALIGN(x) \
435 	(_T_OPT_ALIGN((x), _T_OPT_DALIGN_SZ))
436 
437 /*
438  * struct t_opthdr *T_OPT_FIRSTHDR(struct netbuf *nbp):
439  *     Get aligned start of first option header
440  *
441  * unsigned char *T_OPT_DATA(struct t_opthdr *tohp):
442  *     Get aligned start of data part after option header
443  *
444  * struct t_opthdr *T_OPT_NEXTHDR(struct netbuf *nbp, struct t_opthdr *tohp):
445  * 	Skip to next option header
446  */
447 
448 #define	T_OPT_FIRSTHDR(nbp)    \
449 	((nbp)->len >= _T_OPTHDR_SZ ? (struct t_opthdr *)(nbp)->buf : \
450 	    (struct t_opthdr *)0)
451 
452 #define	T_OPT_DATA(tohp)	\
453 	((unsigned char *)_T_OPTDATA_ALIGN((char *)(tohp) + _T_OPTHDR_SZ))
454 
455 #define	_T_NEXTHDR(pbuf, buflen, popt) \
456 	(((char *)_T_OPTHDR_ALIGN((char *)(popt) + (popt)->len) + \
457 	    _T_OPTHDR_SZ <= ((char *)(pbuf) + (buflen))) ? \
458 	(struct t_opthdr *)((char *)_T_OPTHDR_ALIGN((char *)(popt) + \
459 	    (popt)->len)) : (struct t_opthdr *)0)
460 
461 #define	T_OPT_NEXTHDR(nbp, tohp)   (_T_NEXTHDR((nbp)->buf, (nbp)->len, (tohp)))
462 
463 #if !defined(_XPG5)
464 /*
465  * The macros below are meant for older applications for compatibility.
466  * New applications should use the T_OPT_* macros, obviating the need
467  * to explicitly use the T_ALIGN macro
468  *
469  * struct t_opthdr *OPT_NEXTHDR(char *pbuf, unsigned int buflen,
470  *                               struct t_opthdr *popt):
471  *         Skip to next option header
472  */
473 #define	T_ALIGN(p)	(((uintptr_t)(p) + (sizeof (t_scalar_t) - 1))\
474 					& ~(sizeof (t_scalar_t) - 1))
475 #define	OPT_NEXTHDR(pbuf, buflen, popt)	(_T_NEXTHDR((pbuf), (buflen), (popt)))
476 #endif
477 
478 /*
479  * XTI LIBRARY FUNCTIONS
480  */
481 
482 #if defined(__STDC__)
483 
484 #if defined(_XOPEN_SOURCE) && !defined(_XPG5)
485 extern int t_accept(int, int, struct t_call *);
486 extern char *t_alloc(int, int, int);
487 extern int t_bind(int, struct t_bind *, struct t_bind *);
488 extern int t_connect(int, struct t_call *, struct t_call *);
489 extern int t_error(char *);
490 extern int t_free(char *, int);
491 extern int t_open(char *, int, struct t_info *);
492 extern int t_optmgmt(int, struct t_optmgmt *, struct t_optmgmt *);
493 extern int t_rcv(int, char *, unsigned int, int *);
494 extern int t_snd(int, char *, unsigned int, int);
495 extern int t_snddis(int, struct t_call *);
496 extern int t_sndudata(int, struct t_unitdata *);
497 extern char *t_strerror(int);
498 #else
499 extern int t_accept(int, int, const struct t_call *);
500 extern void *t_alloc(int, int, int);
501 extern int t_bind(int, const struct t_bind *, struct t_bind *);
502 extern int t_connect(int, const struct t_call *, struct t_call *);
503 extern int t_error(const char *);
504 extern int t_free(void *, int);
505 extern int t_open(const char *, int, struct t_info *);
506 extern int t_optmgmt(int, const struct t_optmgmt *, struct t_optmgmt *);
507 extern int t_rcv(int, void *, unsigned int, int *);
508 extern int t_snd(int, void *, unsigned int, int);
509 extern int t_snddis(int, const struct t_call *);
510 extern int t_sndudata(int, const struct t_unitdata *);
511 extern const char *t_strerror(int);
512 #endif
513 extern int t_close(int);
514 extern int t_getinfo(int, struct t_info *);
515 extern int t_getstate(int);
516 extern int t_getprotaddr(int, struct t_bind *, struct t_bind *);
517 extern int t_listen(int, struct t_call *);
518 extern int t_look(int);
519 extern int t_rcvconnect(int, struct t_call *);
520 extern int t_rcvdis(int, struct t_discon *);
521 extern int t_rcvrel(int);
522 extern int t_rcvreldata(int, struct t_discon *);
523 extern int t_rcvudata(int, struct t_unitdata *, int *);
524 extern int t_rcvuderr(int, struct t_uderr *);
525 extern int t_rcvv(int, struct t_iovec *, unsigned int, int *);
526 extern int t_rcvvudata(int, struct t_unitdata *, struct t_iovec *,
527 	unsigned int, int *);
528 extern int t_sndrel(int);
529 extern int t_sndreldata(int, struct t_discon *);
530 extern int t_sndv(int, const struct t_iovec *,  unsigned int, int);
531 extern int t_sndvudata(int, struct t_unitdata *, struct t_iovec *,
532 	unsigned int);
533 extern int t_sync(int);
534 extern int t_sysconf(int);
535 extern int t_unbind(int);
536 
537 #endif /* __STDC__ */
538 
539 #ifdef	__cplusplus
540 }
541 #endif
542 
543 #endif	/* _XTI_H */
544