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