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
  62 extern "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)
 130 extern 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 
 148 struct 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 
 272 int _xti_accept(int, int, struct t_call *);
 273 int _xti_xns5_accept(int, int, struct t_call *);
 274 char *_xti_alloc(int, int, int);
 275 int _xti_bind(int, struct t_bind *, struct t_bind *);
 276 int _xti_close(int);
 277 int _xti_connect(int, struct t_call *, struct t_call *);
 278 int _xti_error(char *);
 279 int _xti_free(char *, int);
 280 int _xti_getinfo(int, struct t_info *);
 281 int _xti_getprotaddr(int, struct t_bind *, struct t_bind *);
 282 int _xti_getstate(int);
 283 int _xti_listen(int, struct t_call *);
 284 int _xti_look(int);
 285 int _xti_open(char *, int, struct t_info *);
 286 int _xti_optmgmt(int, struct t_optmgmt *, struct t_optmgmt *);
 287 int _xti_rcv(int, char *, unsigned int, int *);
 288 int _xti_rcvconnect(int, struct t_call *);
 289 int _xti_rcvdis(int, struct t_discon *);
 290 int _xti_rcvrel(int);
 291 int _xti_rcvreldata(int, struct t_discon *);
 292 int _xti_rcvudata(int, struct t_unitdata *, int *);
 293 int _xti_rcvuderr(int, struct t_uderr *);
 294 int _xti_rcvv(int, struct t_iovec *, unsigned int, int *);
 295 int _xti_rcvvudata(int, struct t_unitdata *, struct t_iovec *,
 296     unsigned int, int *);
 297 int _xti_snd(int, char *, unsigned int, int);
 298 int _xti_xns5_snd(int, char *, unsigned int, int);
 299 int _xti_snddis(int, struct t_call *);
 300 int _xti_sndrel(int);
 301 int _xti_sndreldata(int, struct t_discon *);
 302 int _xti_sndudata(int, struct t_unitdata *);
 303 int _xti_sndv(int, const struct t_iovec *, unsigned int, int);
 304 int _xti_sndvudata(int, struct t_unitdata *, struct t_iovec *, unsigned int);
 305 char *_xti_strerror(int);
 306 int _xti_sync(int);
 307 int _xti_sysconf(int);
 308 int _xti_unbind(int);
 309 
 310 #ifdef  __cplusplus
 311 }
 312 #endif
 313 
 314 #endif  /* _XTI_H */