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 */