home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / nsu / root / usr / include / sys / ticots.h / ticots
Text File  |  1998-08-19  |  10KB  |  318 lines

  1. /*
  2.  * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3.  *                                                                         
  4.  *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5.  *                   SANTA CRUZ OPERATION INC.                             
  6.  *                                                                         
  7.  *   The copyright notice above does not evidence any actual or intended   
  8.  *   publication of such source code.                                      
  9.  */
  10.  
  11. #ifndef _NET_LOOPBACK_TICOTS_H    /* wrapper symbol for kernel use */
  12. #define _NET_LOOPBACK_TICOTS_H    /* subject to change without notice */
  13.  
  14. #ident    "@(#)ticots.h    1.2"
  15. #ident    "$Header: $"
  16.  
  17. #if defined(__cplusplus)
  18. extern "C" {
  19. #endif
  20.  
  21. /*
  22.  *    ticots provider-dependent info
  23.  *    (provider-independent applications must not include this header file)
  24.  */
  25.  
  26. #ifdef _KERNEL_HEADERS
  27.  
  28. #include <util/types.h>    /* REQUIRED */
  29. #include <io/stream.h>    /* REQUIRED */
  30.  
  31. #elif defined(_KERNEL) || defined(_KMEMUSER)
  32.  
  33. #include <sys/types.h>    /* REQUIRED */
  34. #include <sys/stream.h>    /* REQUIRED */
  35.  
  36. #endif /* _KERNEL_HEADERS */
  37.  
  38. /*
  39.  * The following control message types are handled by the ticots module.
  40.  */
  41. #define    TCOMOD             ('T'<<16 | 'C'<<8)
  42. #define    TCO_CONNINDQUERY    (TCOMOD|201)
  43. #define    TCO_CONNINDACK        (TCOMOD|202)
  44. #define    TCO_CONNINDNAK        (TCOMOD|203)
  45.  
  46. /* basic constant - not ifdef KERNEL for ABI */
  47. #define TCO_DEFAULTADDRSZ    4            /* default addr sz */
  48.  
  49. /*
  50.  *    disconnect reason codes     (see t_rcvdis())
  51.  */
  52. #define TCO_NOPEER         ECONNREFUSED    /* no listener on dest addr */
  53. #define TCO_PEERNOROOMONQ    ECONNREFUSED    /* peer has no room on incoming queue */
  54. #define TCO_PEERBADSTATE    ECONNREFUSED    /* peer in wrong state */
  55. #define TCO_PEERINITIATED     ECONNRESET    /* peer-initiated disconnect */
  56. #define TCO_PROVIDERINITIATED     ECONNABORTED    /* provider-initiated disconnect */
  57.  
  58. /*
  59.  *    options (flattened linked-list of flattened C-structures)
  60.  */
  61. #define TCO_OPT_NOHDR        0        /* invalid nexthdr offset (end of list) */
  62.  
  63. #define TCO_OPT_NOOP        1        /* no-op opt -- default */
  64. #define TCO_OPT_SETID        2        /* set ident */
  65. #define TCO_OPT_GETID        3        /* get ident */
  66. #define TCO_OPT_UID        4        /* uid info */
  67. #define TCO_OPT_GID        5        /* gid info */
  68. #define TCO_OPT_RUID        6        /* ruid info */
  69. #define TCO_OPT_RGID        7        /* rgid info */
  70.  
  71. #define TCO_IDFLG_UID        0x1        /* uid flag */
  72. #define TCO_IDFLG_GID        0x2        /* gid flag */
  73. #define TCO_IDFLG_RUID        0x4        /* ruid flag */
  74. #define TCO_IDFLG_RGID        0x8        /* rgid flag */
  75.  
  76. /*
  77.  * control message structure introduced for handling nonblocking AF_UNIX
  78.  * connect requests
  79.  */
  80. struct tco_control {
  81.     unsigned long    type;
  82. };
  83.  
  84. /* header for maintaining list of opts; one for each opt in list;
  85.    offsets are measured from beginning of options buffer;
  86.    headers must occur in increasing order, to avoid loops */
  87. struct tco_opt_hdr {
  88.     long            hdr_thisopt_off;    /* offset to current opt */
  89.     long            hdr_nexthdr_off;    /* offset to next hdr */
  90. };
  91.  
  92. /* no-op opt -- the default */
  93. struct tco_opt_noop {
  94.     long            noop_type;    /* TCO_OPT_NOOP; must be first */
  95. };
  96.  
  97. /* set ident opt -- subsequent t_rcvudata()'s
  98.    (i.e., T_UNITDATA_IND) will contain peer's ident info */
  99. struct tco_opt_setid {
  100.     long            setid_type;    /* TCO_OPT_SETID; must be first */
  101.     long            setid_flg;    /* which id opts to set */
  102. };
  103.  
  104. /* get ident opt */
  105. struct tco_opt_getid {
  106.     long            getid_type;    /* TCO_OPT_GETID; must be first */
  107.     long            getid_flg;    /* which id opts are set */
  108. };
  109.  
  110. /* uid info opt */
  111. struct tco_opt_uid {
  112.     long            uid_type;    /* TCO_OPT_UID; must be first */
  113.     uid_t            uid_val;    /* effective user id */
  114. };
  115.  
  116. /* gid info opt */
  117. struct tco_opt_gid {
  118.     long            gid_type;    /* TCO_OPT_GID; must be first */
  119.     gid_t            gid_val;    /* effective group id */
  120. };
  121.  
  122. /* ruid info opt */
  123. struct tco_opt_ruid {
  124.     long            ruid_type;    /* TCO_OPT_RUID; must be first */
  125.     uid_t            ruid_val;    /* real user id */
  126. };
  127.  
  128. /* rgid info opt */
  129. struct tco_opt_rgid {
  130.     long            rgid_type;    /* TCO_OPT_RGID; must be first */
  131.     gid_t            rgid_val;    /* real group id */
  132. };
  133.  
  134. /* union of all the opts */
  135. union tco_opt {
  136.     long            opt_type;    /* opt type; must be first */
  137.     struct tco_opt_noop    opt_noop;    /* noop opt */
  138.     struct tco_opt_setid    opt_setid;    /* set ident opt */
  139.     struct tco_opt_getid    opt_getid;    /* get ident opt */
  140.     struct tco_opt_uid    opt_uid;    /* uid info opt */
  141.     struct tco_opt_gid    opt_gid;    /* gid info opt */
  142.     struct tco_opt_ruid    opt_ruid;    /* ruid info opt */
  143.     struct tco_opt_rgid    opt_rgid;    /* rgid info opt */
  144. };
  145.  
  146. /******************************************************************************/
  147.  
  148. #ifdef _KERNEL
  149.  
  150. /*
  151.  *    transport endpoint structure
  152.  */
  153. struct tco_endpt {
  154.     lock_t            *te_lock;    /* lock for all con oriented 
  155.                          * fields */
  156.     event_t            *te_event;    /* event */
  157.     int             te_bid;    /* bufcall id */
  158.     struct tco_endpt    *te_folist;    /* forw ptr, list of open
  159.                          * endpts */
  160.     struct tco_endpt    *te_bolist;    /* back ptr, list of open 
  161.                          * endpts */
  162.     struct tco_endpt    *te_frqlist;    /* forw ptr, te_rq list */
  163.     struct tco_endpt    *te_brqlist;    /* back ptr, te_rq list */
  164.     struct tco_endpt    *te_fblist;    /* forw ptr, list of endpts
  165.                          * bound to addr */
  166.     struct tco_endpt    *te_bblist;    /* back ptr, list of endpts
  167.                          * bound to addr */
  168.     queue_t            *te_rq;        /* stream read queue */
  169.     struct tco_addr        *te_addr;    /* addr bound to this endpt */
  170.     minor_t            te_min;        /* minor number */
  171.     unsigned short        te_rqhash;    /* te_rq hash bucket */
  172.     char             te_state;    /* state of interface */
  173.     char            te_flg;        /* internal flags */
  174.     long            te_idflg;    /* ident flags */
  175.     unsigned char        te_ref;        /* reference count on queue */
  176.     unsigned char        te_qlen;    /* max incoming connect reqs
  177.                          * pending */
  178.     unsigned char        te_nicon;    /* num of incoming connect
  179.                          * reqs pending */
  180.  
  181. #define TCO_MAXQLEN        8        /* must be <= (1 << 
  182.                          * (NBBY*sizeof(te_nicon))) */
  183.  
  184.     struct tco_endpt    *te_icon[TCO_MAXQLEN];    /* incoming connect
  185.                          * requests pending */
  186.     struct tco_endpt    *te_ocon;    /* outgoing connect request
  187.                          * pending */
  188.     struct tco_endpt    *te_con;    /* connected endpt */
  189.     uid_t            te_uid;        /* uid - No protection needed */
  190.     gid_t            te_gid;        /* gid - No protection needed */
  191.     uid_t            te_ruid;    /* ruid- No protection needed */
  192.     gid_t            te_rgid;    /* rgid- No protection needed */
  193.     char             te_pstate;    /* prior state of interface */
  194. };
  195. typedef struct tco_endpt    tco_endpt_t;
  196.  
  197. /*
  198.  *    transport addr structure
  199.  */
  200. struct tco_addr {
  201.     struct tco_addr        *ta_falist;    /* forw ptr, list of bound addrs */
  202.     struct tco_addr        *ta_balist;    /* back ptr, list of bound addrs */
  203.     struct tco_endpt    *ta_hblist;    /* head ptr, list of endpts bound to this addr */
  204.     struct tco_endpt    *ta_tblist;    /* tail ptr, list of endpts bound to this addr */
  205.     unsigned short         ta_ahash;    /* addr hash bucket */
  206.     long            ta_alen;    /* length of abuf */
  207.     char            *ta_abuf;    /* the addr itself */
  208. };
  209. typedef struct tco_addr        tco_addr_t;
  210.  
  211. /*
  212.  *    registered id
  213.  */
  214. #ifdef TICOTS
  215. #define TCO_ID            10002
  216. #endif
  217. #ifdef TICOTSORD
  218. #define    TCO_ID            10003
  219. #endif
  220.  
  221. /*
  222.  *    basic constants
  223.  */
  224. #ifdef TICOTS
  225. #define TCO_SERVTYPE        T_COTS
  226. #endif
  227. #ifdef TICOTSORD
  228. #define TCO_SERVTYPE        T_COTS_ORD
  229. #endif
  230. #define TCO_TIDUSZ        (4*1024)        /* max packet size */
  231. /* can't make the following 4 sizes -1 (unlimited), because of bug in TLI/TPI 
  232.  * specs: unlimited data can be sent but cannot received in a well-specified 
  233.  * way (receiver doesn't know how big to make buffer, and T_MORE flag can't 
  234.  * be used)
  235.  */
  236. #define TCO_ADDRSZ        (256-(sizeof(struct T_bind_req)))
  237. #define TCO_OPTSZ        (TCO_TIDUSZ-(sizeof(struct T_optmgmt_req)))
  238. #define TCO_CDATASZ        (TCO_TIDUSZ-(sizeof(struct T_conn_ind)))
  239. #define TCO_DDATASZ        (TCO_TIDUSZ-(sizeof(struct T_discon_ind)))
  240. #define TCO_TSDUSZ        -1            /* unlimited */
  241. #define TCO_ETSDUSZ        -1            /* unlimited */
  242. #define TCO_MINPSZ        0
  243. #define TCO_MAXPSZ        TCO_TIDUSZ
  244. #define TCO_LOWAT        (TCO_TIDUSZ/4)
  245. #define TCO_HIWAT        (4*TCO_TIDUSZ)
  246.  
  247. /*
  248.  *    te_flg
  249.  */
  250. #define TCO_ZOMBIE        0x1        /* fatal error on endpoint */
  251. #define    TCO_DISCONNECTED    0x2        /* endpoint is disconnected */
  252. #define    TCO_CONNINDQUEUED    0x4        /* most recent T_CONN_REQ caused
  253.                            T_CONN_IND to be queued */
  254.  
  255.  
  256. /*
  257.  *    pass/fail indicators
  258.  */
  259. #define TCO_REALOPT        0x01            /* for tco_ckopt() */
  260. #define TCO_NOOPOPT        0x02            /* for tco_ckopt() */
  261. #define TCO_BADFORMAT        0x04            /* for tco_ckopt() */
  262. #define TCO_BADTYPE        0x08            /* for tco_ckopt() */
  263. #define TCO_BADVALUE        0x10            /* for tco_ckopt() */
  264. #define BADSEQNUM        ((long)(-1))        /* should be standardized */
  265.  
  266. /*
  267.  *    internal defines
  268.  */
  269. #define TCO_BIND        1
  270. #define TCO_CONN        2
  271. #define TCO_OPEN        3
  272. #define TCO_RQ            4
  273. #define TCO_IDFLG_ALL        (TCO_IDFLG_UID | TCO_IDFLG_GID | TCO_IDFLG_RUID | TCO_IDFLG_RGID)
  274. #define TCO_MHASH        5
  275. #define TCO_NMHASH        (1 << TCO_MHASH)    /* num of hash buckets in open endpt table */
  276. #define TCO_MMASK        (TCO_NMHASH - 1)
  277. #define TCO_RQHASH        5            /* must be <= NBBY*sizeof(te_rqhash) */
  278. #define TCO_NRQHASH        (1 << TCO_RQHASH)    /* num of hash buckets in te_rq table */
  279. #define TCO_RQMASK        (TCO_NRQHASH - 1)
  280. /* following magic number and shift factor for fibonacci hash function */
  281. #define TCO_RQMAGIC        0x9ce14b36
  282. #define TCO_RQSHIFT        (NBBY*sizeof(int) - TCO_RQHASH)
  283. #define TCO_AHASH        5            /* must be <= NBBY*sizeof(ta_ahash) */
  284. #define TCO_NAHASH        (1 << TCO_AHASH)    /* num of hash buckets in bound addr table */
  285. #define TCO_AMASK        (TCO_NAHASH - 1)
  286. /*
  287.  *    some useful macros
  288.  */
  289. #define tco_min(TE)        ((TE)->te_min)
  290. #define tco_mkmhash(TE)        ((unsigned)(tco_min(TE)) & TCO_MMASK)
  291. #define tco_mhash(TE)        tco_mkmhash(TE)
  292. #define tco_mkrqhash(TE)    (((((unsigned)((TE)->te_rq))*TCO_RQMAGIC) >> TCO_RQSHIFT) & TCO_RQMASK)
  293. #define tco_rqhash(TE)        ((unsigned)(TE)->te_rqhash)
  294. #define tco_alen(TA)        ((TA)->ta_alen)
  295. #define tco_abuf(TA)        ((TA)->ta_abuf)
  296. #define tco_ahash(TA)        ((unsigned)(TA)->ta_ahash)
  297. #define tco_mkahash(TA)        ((unsigned)(tco_sumbytes(tco_abuf(TA),tco_alen(TA)) & TCO_AMASK))
  298. #define tco_eqabuf(TA,TB)    ((tco_alen(TA) == tco_alen(TB)) \
  299.                  && (bcmp(tco_abuf(TA),tco_abuf(TB),tco_alen(TA)) == 0))
  300.  
  301. /*
  302.  *    STRLOG tracing levels:
  303.  *
  304.  *    0 = urgent
  305.  *    1 = fatal
  306.  *    2 = errack
  307.  *    3 = interesting stuff
  308.  *    4 = chit-chat
  309.  */
  310.  
  311. #endif /* _KERNEL */
  312.  
  313. #if defined(__cplusplus)
  314.     }
  315. #endif
  316.  
  317. #endif /* _NET_LOOPBACK_TICOTS_H */
  318.