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/*
23 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
24 */
25/*	Copyright (c) 1996 Sun Microsystems, Inc.	*/
26/*	  All Rights Reserved	*/
27/*
28 * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
29 */
30
31#ifndef _XTI_H
32#define	_XTI_H
33
34#include <sys/types.h>
35
36/*
37 * The following include file has declarations needed by both the kernel
38 * level transport providers and the user level library. This file includes
39 * it to expose its namespaces to XTI user level interface.
40 */
41#include <sys/tpicommon.h>
42
43/*
44 * Include XTI interface level options management declarations
45 */
46#include <sys/xti_xtiopt.h>
47
48#if !defined(_XPG5)
49
50/*
51 * Include declarations related to OSI transport and management data
52 * structures, and the Internet Protocol Suite.
53 * Note: The older Unix95/XNS4 XTI spec required these to be
54 * exposed through the generic interface header.
55 */
56#include <sys/xti_osi.h>
57#include <sys/xti_inet.h>
58
59#endif /* !defined(_XPG5) */
60
61#ifdef	__cplusplus
62extern "C" {
63#endif
64
65/*
66 * The following t_errno error codes are included in the namespace by
67 * inclusion of <sys/tpicommon.h> above. The english language error strings
68 * associated with the error values are reproduced here for easy reference.
69 *
70 * Error		Value	Error message string
71 * ----			-----	--------------------
72 * TBADADDR		1	Incorrect address format
73 * TBADOPT		2	Incorrect options format
74 * TACCES		3	Illegal permissions
75 * TBADF		4	Illegal file descriptor
76 * TNOADDR		5	Couldn't allocate address
77 * TOUTSTATE		6	Routine will place interface out of state
78 * TBADSEQ		7	Illegal called/calling sequence number
79 * TSYSERR		8	System error
80 * TLOOK		9	An event requires attention
81 * TBADDATA		10	Illegal amount of data
82 * TBUFOVFLW		11	Buffer not large enough
83 * TFLOW		12	Can't send message - (blocked)
84 * TNODATA		13	No message currently available
85 * TNODIS		14	Disconnect message not found
86 * TNOUDERR		15	Unitdata error message not found
87 * TBADFLAG		16	Incorrect flags specified
88 * TNOREL		17	Orderly release message not found
89 * TNOTSUPPORT		18	Primitive not supported by provider
90 * TSTATECHNG		19	State is in process of changing
91 * TNOSTRUCTYPE		20	Unsupported structure type requested
92 * TBADNAME		21	Invalid transport provider name
93 * TBADQLEN		22	Listener queue length limit is zero
94 * TADDRBUSY		23	Transport address is in use
95 * TINDOUT		24	Outstanding connection indications
96 * TPROVMISMATCH	25	Listener-acceptor transport provider mismatch
97 * TRESQLEN		26	Connection acceptor has listen queue length
98 *				limit greater than zero
99 * TRESADDR		27	Connection acceptor-listener addresses not
100 *				same but required by transport
101 * TQFULL		28	Incoming connection queue is full
102 * TPROTO		29	Protocol error on transport primitive
103 *
104 */
105
106/*
107 * The following are the events returned by t_look
108 */
109#define	T_LISTEN	0x0001	/* connection indication received	*/
110#define	T_CONNECT	0x0002	/* connect confirmation received	*/
111#define	T_DATA		0x0004	/* normal data received			*/
112#define	T_EXDATA	0x0008	/* expedited data received		*/
113#define	T_DISCONNECT	0x0010	/* disconnect received			*/
114#define	T_UDERR		0x0040	/* data gram error indication		*/
115#define	T_ORDREL	0x0080	/* orderly release indication		*/
116#define	T_GODATA	0x0100	/* sending normal data is again possible */
117#define	T_GOEXDATA	0x0200	/* sending expedited data is again possible */
118
119/*
120 * Flags for data primitives
121 */
122#define	T_MORE		0x001	/* more data		*/
123#define	T_EXPEDITED	0x002	/* expedited data	*/
124#define	T_PUSH		0x004	/* send data immediately */
125
126/*
127 * XTI error return
128 */
129#if defined(_REENTRANT) || defined(_TS_ERRNO)
130extern int	*__t_errno();
131#define	t_errno (*(__t_errno()))
132#else
133#error "extern int t_errno?"
134#endif	/* defined(_REENTRANT) || defined(_TS_ERRNO) */
135
136
137/*
138 * The following are for t_sysconf()
139 */
140#ifndef T_IOV_MAX
141#define	T_IOV_MAX	16	/* Maximum number of scatter/gather buffers */
142#endif				/* Should be <= IOV_MAX */
143
144#ifndef _SC_T_IOV_MAX
145#define	_SC_T_IOV_MAX	79	/* Should be same in <unistd.h> for use by */
146#endif				/* sysconf() */
147
148struct t_iovec {
149	void	*iov_base;
150	size_t	iov_len;
151};
152
153/*
154 * Translate source level interface to binary entry point names.
155 *
156 * Note: This is done to maintain co-existence of TLI and XTI
157 * interfaces which have identical names for most functions but
158 * different semantics. The XTI names are moved to the different
159 * prefix space in the ABI. The #ifdef is required to make use of
160 * of the compiler feature to allow redefinition of external names
161 * where available. Otherwise a simple #define is used when this
162 * header is used with other compilers.
163 * The use of #define also has the effect of renaming all names (not
164 * just function names) to the new name. The TLI function names
165 * (e.g. t_bind) can have identical names for structure names
166 * (e.g struct t_bind). Therefore, this redefinition of names needs
167 * to be before all structure and function name declarations in the header.
168 */
169
170#ifdef __PRAGMA_REDEFINE_EXTNAME
171
172#if defined(_XOPEN_SOURCE) && !defined(_XPG5)
173#pragma redefine_extname t_accept	_xti_accept
174#else
175#pragma redefine_extname t_accept	_xti_xns5_accept
176#endif
177#pragma redefine_extname t_alloc	_xti_alloc
178#pragma redefine_extname t_bind		_xti_bind
179#pragma redefine_extname t_close	_xti_close
180#pragma redefine_extname t_connect	_xti_connect
181#pragma redefine_extname t_error	_xti_error
182#pragma redefine_extname t_free		_xti_free
183#pragma redefine_extname t_getinfo	_xti_getinfo
184#pragma redefine_extname t_getstate	_xti_getstate
185#pragma redefine_extname t_getprotaddr	_xti_getprotaddr
186#pragma redefine_extname t_listen	_xti_listen
187#pragma redefine_extname t_look		_xti_look
188#pragma redefine_extname t_open		_xti_open
189#pragma redefine_extname t_optmgmt	_xti_optmgmt
190#pragma redefine_extname t_rcv		_xti_rcv
191#pragma redefine_extname t_rcvconnect	_xti_rcvconnect
192#pragma redefine_extname t_rcvdis	_xti_rcvdis
193#pragma redefine_extname t_rcvrel	_xti_rcvrel
194#pragma redefine_extname t_rcvreldata	_xti_rcvreldata
195#pragma redefine_extname t_rcvudata	_xti_rcvudata
196#pragma redefine_extname t_rcvuderr	_xti_rcvuderr
197#pragma redefine_extname t_rcvv		_xti_rcvv
198#pragma redefine_extname t_rcvvudata	_xti_rcvvudata
199#if defined(_XOPEN_SOURCE) && !defined(_XPG5)
200#pragma redefine_extname t_snd		_xti_snd
201#else
202#pragma redefine_extname t_snd		_xti_xns5_snd
203#endif
204#pragma redefine_extname t_snddis	_xti_snddis
205#pragma redefine_extname t_sndrel	_xti_sndrel
206#pragma redefine_extname t_sndreldata	_xti_sndreldata
207#pragma redefine_extname t_sndudata	_xti_sndudata
208#pragma redefine_extname t_sndv		_xti_sndv
209#pragma redefine_extname t_sndvudata	_xti_sndvudata
210#pragma redefine_extname t_strerror	_xti_strerror
211#pragma redefine_extname t_sync		_xti_sync
212#pragma redefine_extname t_sysconf	_xti_sysconf
213#pragma redefine_extname t_unbind	_xti_unbind
214
215#else /* __PRAGMA_REDEFINE_EXTNAME */
216
217#if defined(_XOPEN_SOURCE) && !defined(_XPG5)
218#define	t_accept	_xti_accept
219#else
220#define	t_accept	_xti_xns5_accept
221#endif
222#define	t_alloc		_xti_alloc
223#define	t_bind(a,b,c)	_xti_bind(a,b,c)
224#define	t_close		_xti_close
225#define	t_connect	_xti_connect
226#define	t_error		_xti_error
227#define	t_free		_xti_free
228#define	t_getinfo	_xti_getinfo
229#define	t_getstate	_xti_getstate
230#define	t_getprotaddr	_xti_getprotaddr
231#define	t_listen	_xti_listen
232#define	t_look		_xti_look
233#define	t_open		_xti_open
234#define	t_optmgmt(a,b,c)	_xti_optmgmt(a,b,c)
235#define	t_rcv		_xti_rcv
236#define	t_rcvconnect	_xti_rcvconnect
237#define	t_rcvdis	_xti_rcvdis
238#define	t_rcvrel	_xti_rcvrel
239#define	t_rcvreldata	_xti_rcvreldata
240#define	t_rcvudata	_xti_rcvudata
241#define	t_rcvuderr	_xti_rcvuderr
242#define	t_rcvv		_xti_rcvv
243#define	t_rcvvudata	_xti_rcvvudata
244#if defined(_XOPEN_SOURCE) && !defined(_XPG5)
245#define	t_snd		_xti_snd
246#else
247#define	t_snd		_xti_xns5_snd
248#endif
249#define	t_snddis	_xti_snddis
250#define	t_sndrel	_xti_sndrel
251#define	t_sndreldata	_xti_sndreldata
252#define	t_sndudata	_xti_sndudata
253#define	t_sndv		_xti_sndv
254#define	t_sndvudata	_xti_sndvudata
255#define	t_strerror	_xti_strerror
256#define	t_sync		_xti_sync
257#define	t_sysconf	_xti_sysconf
258#define	t_unbind	_xti_unbind
259
260#endif /* __PRAGMA_REDEFINE_EXTNAME */
261
262/*
263 * All the rest of the standard xti.h removed because the structs:
264 * netbuf, t_info, t_opthdr, t_optmgmt, t_bind, t_call, ...
265 * all conflict with definitions in tiuser.h which we need
266 * for the (simulated) kernel interfaces in fake_ktli.c.
267 *
268 * The XTI library functions below would normally be defined by
269 * including tiuser.h after the defines above, which we can't.
270 */
271
272int _xti_accept(int, int, struct t_call *);
273int _xti_xns5_accept(int, int, struct t_call *);
274char *_xti_alloc(int, int, int);
275int _xti_bind(int, struct t_bind *, struct t_bind *);
276int _xti_close(int);
277int _xti_connect(int, struct t_call *, struct t_call *);
278int _xti_error(char *);
279int _xti_free(char *, int);
280int _xti_getinfo(int, struct t_info *);
281int _xti_getprotaddr(int, struct t_bind *, struct t_bind *);
282int _xti_getstate(int);
283int _xti_listen(int, struct t_call *);
284int _xti_look(int);
285int _xti_open(char *, int, struct t_info *);
286int _xti_optmgmt(int, struct t_optmgmt *, struct t_optmgmt *);
287int _xti_rcv(int, char *, unsigned int, int *);
288int _xti_rcvconnect(int, struct t_call *);
289int _xti_rcvdis(int, struct t_discon *);
290int _xti_rcvrel(int);
291int _xti_rcvreldata(int, struct t_discon *);
292int _xti_rcvudata(int, struct t_unitdata *, int *);
293int _xti_rcvuderr(int, struct t_uderr *);
294int _xti_rcvv(int, struct t_iovec *, unsigned int, int *);
295int _xti_rcvvudata(int, struct t_unitdata *, struct t_iovec *,
296    unsigned int, int *);
297int _xti_snd(int, char *, unsigned int, int);
298int _xti_xns5_snd(int, char *, unsigned int, int);
299int _xti_snddis(int, struct t_call *);
300int _xti_sndrel(int);
301int _xti_sndreldata(int, struct t_discon *);
302int _xti_sndudata(int, struct t_unitdata *);
303int _xti_sndv(int, const struct t_iovec *, unsigned int, int);
304int _xti_sndvudata(int, struct t_unitdata *, struct t_iovec *, unsigned int);
305char *_xti_strerror(int);
306int _xti_sync(int);
307int _xti_sysconf(int);
308int _xti_unbind(int);
309
310#ifdef	__cplusplus
311}
312#endif
313
314#endif	/* _XTI_H */
315