xref: /illumos-gate/usr/src/lib/libnsl/nsl/tx.h (revision 61961e0f)
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 /*
24  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
25  * Use is subject to license terms.
26  */
27 
28 #ifndef	_TX_H
29 #define	_TX_H
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 #include <sys/uio.h>
34 
35 #ifdef	__cplusplus
36 extern "C" {
37 #endif
38 
39 /*
40  * This file contains declarations local to the TLI/XTI implmentation
41  */
42 
43 /*
44  * Look buffer list
45  * Could be multiple buffers for MT case
46  */
47 struct _ti_lookbufs {
48 	struct _ti_lookbufs *tl_next; /* next in list   */
49 	int	tl_lookclen;	/* "look" ctl part length */
50 	char	*tl_lookcbuf;	/* pointer to "look" ctl	*/
51 	int	tl_lookdlen;	/* "look" data length	*/
52 	char	*tl_lookdbuf;	/* pointer to "look" data */
53 };
54 
55 /* TI interface user level structure - one per open file */
56 
57 struct _ti_user {
58 	struct _ti_user	*ti_next; 	/* next one		*/
59 	struct _ti_user	*ti_prev; 	/* previous one	*/
60 	int	ti_fd;			/* file descriptor	*/
61 	struct  _ti_lookbufs ti_lookbufs; /* head of list of look buffers */
62 	int	ti_lookcnt;		/* buffered look flag	*/
63 	ushort_t ti_flags;		/* flags		*/
64 	int	ti_rcvsize;	/* connect or disconnect data buf size */
65 	char	*ti_rcvbuf;		/* connect or disconnect data buffer */
66 	int	ti_ctlsize;		/* ctl buffer size	*/
67 	char	*ti_ctlbuf;		/* ctl buffer		*/
68 	int	ti_state;		/* user level state	*/
69 	int	ti_ocnt;		/* # outstanding connect indications */
70 	t_scalar_t	ti_maxpsz;	/* TIDU size		*/
71 	t_scalar_t	ti_tsdusize;	/* TSDU size		*/
72 	t_scalar_t	ti_etsdusize;	/* ETSDU size		*/
73 	t_scalar_t	ti_cdatasize;	/* CDATA_size		*/
74 	t_scalar_t	ti_ddatasize;	/* DDATA_size		*/
75 	t_scalar_t	ti_servtype;	/* service type		*/
76 	t_scalar_t	ti_prov_flag;	/* TPI PROVIDER_flag	*/
77 	uint_t	ti_qlen;	/* listener backlog limit */
78 	t_uscalar_t	acceptor_id;	/* Saved acceptor_id value */
79 	dev_t	ti_rdev;		/* for fd validation */
80 	ino_t	ti_ino;			/* for fd validation */
81 	mutex_t ti_lock;	/* lock to protect this data structure */
82 };
83 
84 /*
85  * Local flags used with ti_flags field in instance structure of
86  * type 'struct _ti_user' declared above. Historical note:
87  * This namespace constants were previously declared in a
88  * a very messed up namespace in timod.h
89  */
90 #define	USED		0x0001	/* data structure in use		*/
91 #define	MORE		0x0008	/* more data				*/
92 #define	EXPEDITED	0x0010	/* processing expedited TSDU		*/
93 #define	V_ACCEPTOR_ID	0x0020	/* acceptor_id field is has valid value	*/
94 #define	TX_TQFULL_NOTIFIED 0x0040  /* TQFULL error has been returned once  */
95 
96 
97 /*
98  * Valid flags that can be passed by user in t_sndv() or t_snd()
99  */
100 
101 #define	TX_ALL_VALID_FLAGS (T_MORE|T_EXPEDITED|T_PUSH)
102 
103 #define	_T_MAX(x, y) 		((x) > (y) ? (x) : (y))
104 
105 /*
106  * Following are used to indicate which API entry point is calling common
107  * routines
108  */
109 #define		TX_TLI_API	1	/* The API semantics is TLI */
110 #define		TX_XTI_XNS4_API	2	/* The API semantics is XTI Unix95 */
111 #define		TX_XTI_XNS5_API	3	/* The API semantics is XTI Unix98 */
112 #define		TX_XTI_API	TX_XTI_XNS4_API
113 					/* The base XTI semantics is Unix95 */
114 
115 /* _T_IS_XTI(x) - Is 'x' an XTI inspired api_semantics */
116 #define		_T_IS_XTI(x)	((x) != TX_TLI_API)
117 #define		_T_IS_TLI(x)	((x) == TX_TLI_API)
118 
119 /* _T_API_VER_LT(x, y) - Is API version 'x' older than API version 'y' */
120 #define		_T_API_VER_LT(x, y)	((x) < (y))
121 
122 /*
123  * Note: T_BADSTATE also defined in <sys/tiuser.h>
124  */
125 #define	T_BADSTATE 8
126 
127 #ifdef DEBUG
128 #include <syslog.h>
129 #define	_T_TX_SYSLOG2(tiptr, X, Y) if ((tiptr)->ti_state == T_BADSTATE)\
130 	syslog(X, Y)
131 #else
132 #define	_T_TX_SYSLOG2(tiptr, X, Y)
133 #endif	/* DEBUG */
134 
135 /*
136  * Macro to change state and log invalid state error
137  */
138 
139 #define	_T_TX_NEXTSTATE(event, tiptr, errstr)	\
140 	{	tiptr->ti_state = tiusr_statetbl[event][(tiptr)->ti_state]; \
141 		_T_TX_SYSLOG2((tiptr), LOG_ERR, errstr); \
142 	}
143 
144 /*
145  * External declarations
146  */
147 extern mutex_t _ti_userlock;
148 
149 /*
150  * Useful shared local constants
151  */
152 
153 /*
154  * TX_XTI_LEVEL_MAX_OPTBUF:
155  * 	Max option buffer requirement reserved for any XTI level options
156  *	passed in an option buffer. This is intended as an upper bound.
157  *	Regardless of what the providers states in OPT_size of T_info_ack,
158  *	XTI level options can also be added to the option buffer and XTI
159  *	test suite in particular stuffs XTI level options whether we support
160  *	them or not.
161  *
162  * Here is the heuristic used to arrive at a value:
163  *	2* [		// factor of 2 for "repeat options" type testing
164  *		(sizeof(struct t_opthdr)+10*sizeof(t_scalar_t))	// XTI_DEBUG
165  *	       +(sizeof(struct t_opthdr)+ 2*sizeof(t_scalar_t))	// XTI_LINGER
166  *	       +(sizeof(struct t_opthdr)+ sizeof(t_scalar_t))	// XTI_RCVBUF
167  *	       +(sizeof(struct t_opthdr)+ sizeof(t_scalar_t))	// XTI_RCVLOWAT
168  *	       +(sizeof(struct t_opthdr)+ sizeof(t_scalar_t))	// XTI_SNDBUF
169  *	       +(sizeof(struct t_opthdr)+ sizeof(t_scalar_t))	// XTI_SNDLOWAT
170  *	   ]
171  * => 2* [ 56+24+20+20+20+20 ]
172  * =>
173  */
174 #define	TX_XTI_LEVEL_MAX_OPTBUF	320
175 
176 
177 /*
178  * Historic information note:
179  * The libnsl/nsl code implements TLI and XTI interfaces using common
180  * code. Most data structures are similar in the exposed interfaces for
181  * the two interfaces (<tiuser.h> and <xti.h>).
182  * The common implementation C files include only <xti.h> which is the
183  * superset in terms of the exposed interfaces. However the file <tiuser.h>
184  * exposes (via <sys/tiuser.h>), in the past contained certain declarations
185  * that are strictly internal to the implementation but were exposed through
186  * their presence in the public header (<tiuser.h>).
187  * Since the implmentation still needs these declarations, they follow
188  * in this file and are removed from exposure through the TLI public header
189  * (<tiuser.h>) which exposed them in the past.
190  */
191 
192 /*
193  * The following are TLI/XTI user level events which cause
194  * state changes.
195  * NOTE: Historical namespace pollution warning.
196  * Some of the event names share the namespace with structure tags
197  * so there are defined inside comments here and exposed through
198  * TLI and XTI headers (<tiuser.h> and <xti.h>
199  */
200 
201 #define	T_OPEN 		0
202 /* #define	T_BIND		1 */
203 /* #define	T_OPTMGMT	2 */
204 #define	T_UNBIND	3
205 #define	T_CLOSE		4
206 #define	T_SNDUDATA	5
207 #define	T_RCVUDATA	6
208 #define	T_RCVUDERR	7
209 #define	T_CONNECT1	8
210 #define	T_CONNECT2	9
211 #define	T_RCVCONNECT	10
212 #define	T_LISTN		11
213 #define	T_ACCEPT1	12
214 #define	T_ACCEPT2	13
215 #define	T_ACCEPT3	14
216 #define	T_SND		15
217 #define	T_RCV		16
218 #define	T_SNDDIS1	17
219 #define	T_SNDDIS2	18
220 #define	T_RCVDIS1	19
221 #define	T_RCVDIS2	20
222 #define	T_RCVDIS3	21
223 #define	T_SNDREL	22
224 #define	T_RCVREL	23
225 #define	T_PASSCON	24
226 
227 #define	T_NOEVENTS	25
228 
229 #define	T_NOSTATES 	9	/* number of legal states */
230 
231 extern char tiusr_statetbl[T_NOEVENTS][T_NOSTATES];
232 
233 /*
234  * Band definitions for data flow.
235  */
236 #define	TI_NORMAL	0
237 #define	TI_EXPEDITED	1
238 
239 /*
240  * Bogus states from tiuser.h
241  */
242 #define	T_FAKE		8	/* fake state used when state	*/
243 				/* cannot be determined		*/
244 
245 /*
246  * Flags for t_getname() from tiuser.h
247  * Note: This routine's counterpart in XTI is substatnially modified
248  * (i.e. t_getprotaddr() and does not use these flags)
249  */
250 #define	LOCALNAME	0
251 #define	REMOTENAME	1
252 
253 /*
254  * Obsolete error event for t_look() in TLI, still needed for compatibility
255  * to broken apps that are affected (e.g nfsd,lockd) if real error returned.
256  */
257 #define	T_ERROR 0x0020
258 
259 /*
260  * GENERAL UTILITY MACROS
261  */
262 #define	A_CNT(arr)	(sizeof (arr)/sizeof (arr[0]))
263 #define	A_END(arr)	(&arr[A_CNT(arr)])
264 #define	A_LAST(arr)	(&arr[A_CNT(arr)-1])
265 
266 /*
267  * Following macro compares a signed size obtained from TPI primitive
268  * to unsigned size of buffer where it needs to go into passed using
269  * the "struct netbuf" type.
270  * Since many programs are buggy and forget to initialize "netbuf" or
271  * (while unlikely!) allocated buffer can legally even be larger than
272  * max signed integer, we use the following macro to do unsigned comparison
273  * after verifying that signed quantity is positive.
274  */
275 #define	TLEN_GT_NLEN(tpilen, netbuflen) \
276 	(((tpilen) > 0) && ((unsigned int)(tpilen) > (netbuflen)))
277 
278 
279 /*
280  *	N.B.:  this interface is deprecated.  Use t_strerror() instead.
281  */
282 extern char *t_errlist[];
283 extern int t_nerr;
284 
285 /*
286  * UTILITY ROUTINES FUNCTION PROTOTYPES
287  */
288 
289 extern void _t_adjust_iov(int, struct iovec *, int *);
290 extern struct _ti_user *_t_checkfd(int, int, int);
291 extern int _t_delete_tilink(int);
292 extern int _t_rcv_conn_con(struct _ti_user *, struct t_call *, struct strbuf *,
293 							int);
294 extern int _t_snd_conn_req(struct _ti_user *, const struct t_call *,
295 							struct strbuf *);
296 extern int _t_aligned_copy(struct strbuf *, int, int, char *, t_scalar_t *);
297 extern struct _ti_user *_t_create(int, struct t_info *, int, int *);
298 extern int _t_do_ioctl(int, char *, int, int, int *);
299 extern int _t_is_event(int, struct _ti_user *);
300 extern int _t_is_ok(int, struct _ti_user *, t_scalar_t);
301 extern int _t_look_locked(int, struct _ti_user *, int, int);
302 extern int _t_register_lookevent(struct _ti_user *, caddr_t, int, caddr_t, int);
303 extern void _t_free_looklist_head(struct _ti_user *);
304 extern void _t_flush_lookevents(struct _ti_user *);
305 extern int _t_acquire_ctlbuf(struct _ti_user *, struct strbuf *, int *);
306 extern int _t_acquire_databuf(struct _ti_user *, struct strbuf *, int *);
307 
308 /*
309  * Core function TLI/XTI routines function prototypes
310  */
311 extern int _tx_accept(int, int, const struct t_call *, int);
312 extern char *_tx_alloc(int, int, int, int);
313 extern int _tx_bind(int, const struct t_bind *, struct t_bind *, int);
314 extern int _tx_close(int, int);
315 extern int _tx_connect(int, const struct t_call *, struct t_call *, int);
316 extern int _tx_error(const char *, int);
317 extern int _tx_free(char *, int, int);
318 extern int _tx_getinfo(int, struct t_info *, int);
319 extern int _tx_getname(int, struct netbuf *, int, int);
320 extern int _tx_getstate(int, int);
321 extern int _tx_getprotaddr(int, struct t_bind *, struct t_bind *, int);
322 extern int _tx_listen(int, struct t_call *, int);
323 extern int _tx_look(int, int);
324 extern int _tx_open(const char *, int, struct t_info *, int);
325 extern int _tx_optmgmt(int, const struct t_optmgmt *, struct t_optmgmt *, int);
326 extern int _tx_rcv(int, char *, unsigned, int *, int);
327 extern int _tx_rcvconnect(int, struct t_call *, int);
328 extern int _tx_rcvdis(int, struct t_discon *, int);
329 extern int _tx_rcvrel(int, int);
330 extern int _tx_rcvudata(int, struct t_unitdata *, int *, int);
331 extern int _tx_rcvuderr(int, struct t_uderr *, int);
332 extern int _tx_snd(int, char *, unsigned, int, int);
333 extern int _tx_snddis(int, const struct t_call *, int);
334 extern int _tx_sndrel(int, int);
335 extern int _tx_sndudata(int, const struct t_unitdata *, int);
336 extern char *_tx_strerror(int, int);
337 extern int _tx_sync(int, int);
338 extern int _tx_unbind(int, int);
339 extern int _tx_unbind_locked(int, struct _ti_user *, struct strbuf *);
340 extern int _t_expinline_queued(int, int *);
341 extern int _t_do_postconn_sync(int, struct _ti_user *);
342 
343 /*
344  * The following helper functions are used by scatter/gather functions,
345  * which are defined only for XTI and not available in TLI. Moreover
346  * the definition of struct t_iovec which is used below is not visible to
347  * TLI. Hence tli_wrappers.c should not see the prototypes below.
348  */
349 #ifndef TLI_WRAPPERS
350 unsigned int _t_bytecount_upto_intmax(const struct t_iovec *, unsigned int);
351 void _t_scatter(struct strbuf *, struct t_iovec *, int);
352 void _t_gather(char *, const struct t_iovec *, unsigned int);
353 void _t_copy_tiov_to_iov(const struct t_iovec *, int, struct iovec *, int *);
354 
355 /*
356  * The following scatter/gather and other misc. functions are defined only
357  * for XTI and not available in TLI. Moreover the definition of struct t_iovec
358  * which is used below is not visible to TLI. Hence tli_wrappers.c should not
359  * see the prototypes below.
360  */
361 extern int _tx_rcvv(int, struct t_iovec *, unsigned int,  int *, int);
362 extern int _tx_rcvreldata(int, struct t_discon *, int);
363 extern int _tx_rcvvudata(int, struct t_unitdata *, struct t_iovec *,
364     unsigned int, int *, int);
365 extern int _tx_sndv(int, const struct t_iovec *, unsigned int, int, int);
366 extern int _tx_sndreldata(int, struct t_discon *, int);
367 extern int _tx_sndvudata(int, const struct t_unitdata *, struct t_iovec *,
368     unsigned int, int);
369 extern int _tx_sysconf(int, int);
370 #endif /* TLI_WRAPPERS */
371 
372 #ifdef	__cplusplus
373 }
374 #endif
375 
376 #endif	/* _TX_H */
377