diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /common/quicktime_win32/OpenTransportProtocol.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'common/quicktime_win32/OpenTransportProtocol.h')
| -rw-r--r-- | common/quicktime_win32/OpenTransportProtocol.h | 5241 |
1 files changed, 5241 insertions, 0 deletions
diff --git a/common/quicktime_win32/OpenTransportProtocol.h b/common/quicktime_win32/OpenTransportProtocol.h new file mode 100644 index 0000000..84553e2 --- /dev/null +++ b/common/quicktime_win32/OpenTransportProtocol.h @@ -0,0 +1,5241 @@ +/* + File: OpenTransportProtocol.h + + Contains: Definitions likely to be used by low-level protocol stack implementation. + + Version: QuickTime 7.3 + + Copyright: (c) 2007 (c) 1993-2001 by Apple Computer, Inc. and Mentat Inc., all rights reserved. + + Bugs?: For bug reports, consult the following page on + the World Wide Web: + + http://developer.apple.com/bugreporter/ + +*/ +#ifndef __OPENTRANSPORTPROTOCOL__ +#define __OPENTRANSPORTPROTOCOL__ + +#ifndef __CONDITIONALMACROS__ +#include <ConditionalMacros.h> +#endif + + +#if CALL_NOT_IN_CARBON +#ifndef __FILES__ +#include <Files.h> +#endif + +#ifndef __CODEFRAGMENTS__ +#include <CodeFragments.h> +#endif + +#endif /* CALL_NOT_IN_CARBON */ + +#ifndef __OPENTRANSPORT__ +#include <OpenTransport.h> +#endif + + +#ifdef __cplusplus +#include <stddef.h> +#endif + + +#if PRAGMA_ONCE +#pragma once +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if PRAGMA_IMPORT +#pragma import on +#endif + +#if PRAGMA_STRUCT_ALIGN + #pragma options align=mac68k +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(push, 2) +#elif PRAGMA_STRUCT_PACK + #pragma pack(2) +#endif + +#if defined(__MWERKS__) && TARGET_CPU_68K + #pragma push + #pragma pointers_in_D0 +#endif + +/* ***** Setup Default Compiler Variables ******/ + +/* + OTKERNEL is used to indicate whether the code is being built + for the kernel environment. It defaults to 0. If you include + "OpenTransportKernel.h" before including this file, + it will be 1 and you will only be able to see stuff available + to kernel code. + As we've included "OpenTransport.h" and it defaults this variable + to 0 if it's not already been defined, it should always be defined + by the time we get here. So we just assert that. Assertions in + header files! Cool (-: +*/ + +#ifndef OTKERNEL +#error OpenTransportProtocol.h expects OpenTransport.h to set up OTKERNEL. +#endif /* !defined(OTKERNEL) */ + +/* ***** Shared Client Memory ******/ +#if !OTKERNEL +/* + These allocators allocate memory in the shared client pool, + which is shared between all clients and is not disposed when + a particular client goes away. See DTS Technote ooo + "Understanding Open Transport Memory Management" for details. +*/ +#if CALL_NOT_IN_CARBON +/* + * OTAllocSharedClientMem() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void * ) +OTAllocSharedClientMem(OTByteCount size); + + +/* + * OTFreeSharedClientMem() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTFreeSharedClientMem(void * mem); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +/* ***** UNIX Types ******/ +#if CALL_NOT_IN_CARBON +/* + On UNIX, uid_t and gid_t are defined to be big enough + to hold a user ID and group ID respectively. As Mac OS + has no such concepts, we just define them as UInt32 place + holders. +*/ +typedef UInt32 uid_t; +typedef UInt32 gid_t; +/* Similarly, dev_t is a UNIX type for denoting a device number.*/ +typedef UInt32 dev_t; +/* ***** From the Mentat "strstat.h" ******/ + +/* module statistics structure */ +struct module_stat { + long ms_pcnt; /* count of calls to put proc */ + long ms_scnt; /* count of calls to service proc */ + long ms_ocnt; /* count of calls to open proc */ + long ms_ccnt; /* count of calls to close proc */ + long ms_acnt; /* count of calls to admin proc */ + char * ms_xptr; /* pointer to private statistics */ + short ms_xsize; /* length of private statistics buffer */ +}; +typedef struct module_stat module_stat; +/* ***** From the Mentat "cred.h" ******/ + +struct cred { + UInt16 cr_ref; /* reference count on processes using cred structures */ + UInt16 cr_ngroups; /* number of groups in cr_groups */ + uid_t cr_uid; /* effective user id */ + gid_t cr_gid; /* effective group id */ + uid_t cr_ruid; /* real user id */ + gid_t cr_rgid; /* real group id */ + uid_t cr_suid; /* user id saved by exec */ + gid_t cr_sgid; /* group id saved by exec */ + gid_t cr_groups[1]; /* supplementary groups list */ +}; +typedef struct cred cred; +typedef cred cred_t; +/* Free return structure for esballoc */ +typedef CALLBACK_API_C( void , FreeFuncType )(char * arg); +struct free_rtn { + FreeFuncType free_func; /* Routine to call to free buffer */ + char * free_arg; /* Parameter to free_func */ +}; +typedef struct free_rtn free_rtn; +typedef free_rtn frtn_t; +/* data descriptor */ +typedef struct datab datab; +union datab_db_f { + datab * freep; + free_rtn * frtnp; +}; +typedef union datab_db_f datab_db_f; +struct datab { + datab_db_f db_f; + unsigned char * db_base; /* first byte of buffer */ + unsigned char * db_lim; /* last byte+1 of buffer */ + unsigned char db_ref; /* count of messages pointing to block*/ + unsigned char db_type; /* message type */ + unsigned char db_iswhat; /* message status */ + unsigned char db_filler2; /* for spacing */ + UInt32 db_size; /* used internally */ + unsigned char * db_msgaddr; /* used internally */ + long db_filler; +}; + + +typedef datab dblk_t; +#define db_freep db_f.freep +#define db_frtnp db_f.frtnp + +/* message block */ +struct msgb { + struct msgb * b_next; /* next message on queue */ + struct msgb * b_prev; /* previous message on queue */ + struct msgb * b_cont; /* next message block of message */ + unsigned char * b_rptr; /* first unread data byte in buffer */ + unsigned char * b_wptr; /* first unwritten data byte */ + datab * b_datap; /* data block */ + unsigned char b_band; /* message priority */ + unsigned char b_pad1; + unsigned short b_flag; +#ifdef MSGB_XTRA + + MSGB_XTRA + +#endif + +}; +typedef struct msgb msgb; +typedef msgb mblk_t; +/* mblk flags */ +enum { + MSGMARK = 0x01, /* last byte of message is tagged */ + MSGNOLOOP = 0x02, /* don't pass message to write-side of stream */ + MSGDELIM = 0x04, /* message is delimited */ + MSGNOGET = 0x08 +}; + +/* STREAMS environments are expected to define these constants in a public header file.*/ + +enum { + STRCTLSZ = 256, /* Maximum Control buffer size for messages */ + STRMSGSZ = 8192 /* Maximum # data bytes for messages */ +}; + +/* Message types */ +enum { + QNORM = 0, + M_DATA = 0, /* Ordinary data */ + M_PROTO = 1, /* Internal control info and data */ + M_BREAK = 0x08, /* Request a driver to send a break */ + M_PASSFP = 0x09, /* Used to pass a file pointer */ + M_SIG = 0x0B, /* Requests a signal to be sent */ + M_DELAY = 0x0C, /* Request a real-time delay */ + M_CTL = 0x0D, /* For inter-module communication */ + M_IOCTL = 0x0E, /* Used internally for I_STR requests */ + M_SETOPTS = 0x10, /* Alters characteristics of Stream head */ + M_RSE = 0x11 /* Reserved for internal use */ +}; + +/* MPS private type */ +enum { + M_MI = 0x40, + M_MI_READ_RESET = 1, + M_MI_READ_SEEK = 2, + M_MI_READ_END = 4 +}; + +/* Priority messages types */ +enum { + QPCTL = 0x80, + M_IOCACK = 0x81, /* Positive ack of previous M_IOCTL */ + M_IOCNAK = 0x82, /* Previous M_IOCTL failed */ + M_PCPROTO = 0x83, /* Same as M_PROTO except for priority */ + M_PCSIG = 0x84, /* Priority signal */ + M_FLUSH = 0x86, /* Requests modules to flush queues */ + M_STOP = 0x87, /* Request drivers to stop output */ + M_START = 0x88, /* Request drivers to start output */ + M_HANGUP = 0x89, /* Driver can no longer produce data */ + M_ERROR = 0x8A, /* Reports downstream error condition */ + M_READ = 0x8B, /* Reports client read at Stream head */ + M_COPYIN = 0x8C, /* Requests the Stream to copy data in for a module */ + M_COPYOUT = 0x8D, /* Requests the Stream to copy data out for a module */ + M_IOCDATA = 0x8E, /* Status from M_COPYIN/M_COPYOUT message */ + M_PCRSE = 0x90, /* Reserved for internal use */ + M_STOPI = 0x91, /* Request drivers to stop input */ + M_STARTI = 0x92, /* Request drivers to start input */ + M_HPDATA = 0x93 /* MPS-private type; high priority data */ +}; + +/* Defines for flush messages */ +enum { + FLUSHALL = 1, + FLUSHDATA = 0 +}; + + +enum { + NOERROR = -1 /* used in M_ERROR messages */ +}; + +typedef struct sth_s sth_s; +typedef struct sqh_s sqh_s; +typedef struct q_xtra q_xtra; +#if OTKERNEL +/* + module_info is aligned differently on 68K than + on PowerPC. Yucky. I can't defined a conditionalised + pad field because a) you can't conditionalise specific + fields in the interface definition language used to + create Universal Interfaces, and b) lots of code + assigns C structured constants to global variables + of this type, and these assignments break if you + add an extra field to the type. Instead, I + set the alignment appropriately before defining the + structure. The problem with doing that is that + the interface definition language doesn't allow + my to set the alignment in the middle of a file, + so I have to do this via "pass throughs". This + works fine for the well known languages (C, Pascal), + but may cause problems for other languages (Java, + Asm). +*/ +#if TARGET_CPU_PPC + #pragma options align=power +#endif +struct module_info { + unsigned short mi_idnum; /* module ID number */ + char * mi_idname; /* module name */ + long mi_minpsz; /* min pkt size, for developer use */ + long mi_maxpsz; /* max pkt size, for developer use */ + unsigned long mi_hiwat; /* hi-water mark, for flow control */ + unsigned long mi_lowat; /* lo-water mark, for flow control */ +}; +typedef struct module_info module_info; +typedef module_info * module_infoPtr; +#if TARGET_CPU_PPC + #pragma options align=reset +#endif + + +typedef struct queue queue; +typedef CALLBACK_API_C( OTInt32 , admin_t )(void); +typedef CALLBACK_API_C( void , bufcall_t )(long size); +typedef CALLBACK_API_C( void , bufcallp_t )(long size); +typedef CALLBACK_API_C( OTInt32 , closep_t )(queue *q, OTInt32 foo, cred_t *cred); +typedef CALLBACK_API_C( OTInt32 , old_closep_t )(queue * q); +typedef CALLBACK_API_C( OTInt32 , openp_t )(queue *q, dev_t *dev, OTInt32 foo, OTInt32 bar, cred_t *cred); +typedef CALLBACK_API_C( OTInt32 , openOld_t )(queue *q, dev_t dev, OTInt32 foo, OTInt32 bar); +typedef CALLBACK_API_C( OTInt32 , old_openp_t )(queue *q, dev_t dev, OTInt32 foo, OTInt32 bar); +typedef CALLBACK_API_C( OTInt32 , closeOld_t )(queue * q); +typedef CALLBACK_API_C( OTInt32 , putp_t )(queue *q, msgb *mp); +typedef CALLBACK_API_C( OTInt32 , srvp_t )(queue * q); +struct qinit { + putp_t qi_putp; /* put procedure */ + srvp_t qi_srvp; /* service procedure */ + openp_t qi_qopen; /* called on each open or a push */ + closep_t qi_qclose; /* called on last close or a pop */ + admin_t qi_qadmin; /* reserved for future use */ + module_info * qi_minfo; /* information structure */ + module_stat * qi_mstat; /* statistics structure - optional */ +}; +typedef struct qinit qinit; +/* defines module or driver */ +struct streamtab { + qinit * st_rdinit; /* defines read QUEUE */ + qinit * st_wrinit; /* defines write QUEUE */ + qinit * st_muxrinit; /* for multiplexing drivers only */ + qinit * st_muxwinit; /* ditto */ +}; +typedef struct streamtab streamtab; +struct qband { + struct qband * qb_next; /* next band for this queue */ + unsigned long qb_count; /* weighted count of characters in this band */ + msgb * qb_first; /* head of message queue */ + msgb * qb_last; /* tail of message queue */ + unsigned long qb_hiwat; /* high water mark */ + unsigned long qb_lowat; /* low water mark */ + unsigned short qb_flag; /* ooo.state */ + short qb_pad1; /* ooo reserved */ +}; +typedef struct qband qband; +typedef qband qband_t; +union queue_q_u { + queue * q_u_link; /* link to scheduling queue */ + sqh_s * q_u_sqh_parent; +}; +typedef union queue_q_u queue_q_u; +struct queue { + qinit * q_qinfo; /* procedures and limits for queue */ + msgb * q_first; /* head of message queue */ + msgb * q_last; /* tail of message queue */ + struct queue * q_next; /* next queue in Stream */ + queue_q_u q_u; + char * q_ptr; /* to private data structure */ + unsigned long q_count; /* weighted count of characters on q */ + long q_minpsz; /* min packet size accepted */ + long q_maxpsz; /* max packet size accepted */ + unsigned long q_hiwat; /* high water mark, for flow control */ + unsigned long q_lowat; /* low water mark */ + qband * q_bandp; /* band information */ + unsigned short q_flag; /* ooo queue state */ + unsigned char q_nband; /* ooo number of bands */ + unsigned char q_pad1[1]; /* ooo reserved */ + q_xtra * q_osx; /* Pointer to OS-dependent extra stuff */ + struct queue * q_ffcp; /* Forward flow control pointer */ + struct queue * q_bfcp; /* Backward flow control pointer */ +}; + + +typedef queue * queuePtr; +typedef queue queue_t; +#define q_link q_u.q_u_link +#define q_sqh_parent q_u.q_u_sqh_parent + +/* queue_t flag defines */ +enum { + QREADR = 0x01, /* This queue is a read queue */ + QNOENB = 0x02, /* Don't enable in putq */ + QFULL = 0x04, /* The queue is full */ + QWANTR = 0x08, /* The queue should be scheduled in the next putq */ + QWANTW = 0x10, /* The stream should be back enabled when this queue drains */ + QUSE = 0x20, /* The queue is allocated and ready for use */ + QENAB = 0x40, /* The queue is scheduled (on the run queue) */ + QBACK = 0x80, /* The queue has been back enabled */ + QOLD = 0x0100, /* Module supports old style opens and closes */ + QHLIST = 0x0200, /* The Stream head is doing something with this queue (Not supported by MPS) */ + QWELDED = 0x0400, /* Mentat flag for welded queues */ + QUNWELDING = 0x0800, /* Queue is scheduled to be unwelded */ + QPROTECTED = 0x1000, /* Mentat flag for unsafe q access */ + QEXCOPENCLOSE = 0x2000 /* Queue wants exclusive open/close calls */ +}; + +/* qband_t flag defines */ +enum { + QB_FULL = 0x01, /* The band is full */ + QB_WANTW = 0x02, /* The stream should be back enabled when this band/queue drains */ + QB_BACK = 0x04 /* The queue has been back enabled */ +}; + +#else +/* + Client code views a queue_t as a simple cookie. + The real definition lives above and is only available + to kernel code. +*/ +typedef SInt32 queue_t; +#endif /* OTKERNEL */ + +/* structure contained in M_COPYIN/M_COPYOUT messages */ +typedef char * caddr_t; +struct copyreq { + SInt32 cq_cmd; /* ioctl command (from ioc_cmd) */ + cred * cq_cr; /* pointer to full credentials */ + UInt32 cq_id; /* ioctl id (from ioc_id) */ + caddr_t cq_addr; /* address to copy data to/from */ + UInt32 cq_size; /* number of bytes to copy */ + SInt32 cq_flag; /* state */ + mblk_t * cq_private; /* private state information */ + long cq_filler[4]; +}; +typedef struct copyreq copyreq; +#define cq_uid cq_cr->cr_uid +#define cq_gid cq_cr->cr_gid + + +/* copyreq defines */ +enum { + STRCANON = 0x01, /* b_cont data block contains canonical format specifier */ + RECOPY = 0x02 /* perform I_STR copyin again this time using canonical format specifier */ +}; + +/* structure contained in M_IOCDATA message block */ +struct copyresp { + SInt32 cp_cmd; /* ioctl command (from ioc_cmd) */ + cred * cp_cr; /* pointer to full credentials */ + UInt32 cp_id; /* ioctl id (from ioc_id) */ + caddr_t cp_rval; /* status of request; 0 for success; error value for failure */ + UInt32 cp_pad1; + SInt32 cp_pad2; + mblk_t * cp_private; /* private state information */ + long cp_filler[4]; +}; +typedef struct copyresp copyresp; +#define cp_uid cp_cr->cr_uid +#define cp_gid cp_cr->cr_gid + +/* structure contained in an M_IOCTL message block */ +struct iocblk { + SInt32 ioc_cmd; /* ioctl command type */ + cred * ioc_cr; /* pointer to full credentials */ + UInt32 ioc_id; /* ioctl id */ + UInt32 ioc_count; /* count of bytes in data field */ + SInt32 ioc_error; /* error code */ + SInt32 ioc_rval; /* return value */ + long ioc_filler[4]; +}; +typedef struct iocblk iocblk; +#define ioc_uid ioc_cr->cr_uid +#define ioc_gid ioc_cr->cr_gid + + + +enum { + TRANSPARENT = (unsigned long)0xFFFFFFFF +}; + +/* Used in M_IOCTL mblks to muxes (ioc_cmd I_LINK) */ +struct linkblk { + queue_t * l_qtop; /* lowest level write queue of upper stream */ + queue_t * l_qbot; /* highest level write queue of lower stream */ + SInt32 l_index; /* system-unique index for lower stream */ + long l_pad[5]; +}; +typedef struct linkblk linkblk; +/* structure contained in an M_PASSFP message block */ +struct strpfp { + unsigned long pass_file_cookie; /* file 'pointer' */ + unsigned short pass_uid; /* user id of sending stream */ + unsigned short pass_gid; + sth_s * pass_sth; /* Stream head pointer of passed stream */ +}; +typedef struct strpfp strpfp; +/* structure contained in an M_SETOPTS message block */ +struct stroptions { + unsigned long so_flags; /* options to set */ + short so_readopt; /* read option */ + unsigned short so_wroff; /* write offset */ + long so_minpsz; /* minimum read packet size */ + long so_maxpsz; /* maximum read packet size */ + unsigned long so_hiwat; /* read queue high-water mark */ + unsigned long so_lowat; /* read queue low-water mark */ + unsigned char so_band; /* band for water marks */ + unsigned char so_filler[3]; /* added for alignment */ + unsigned long so_poll_set; /* poll events to set */ + unsigned long so_poll_clr; /* poll events to clear */ +}; +typedef struct stroptions stroptions; +/* definitions for so_flags field */ +enum { + SO_ALL = 0x7FFF, /* Update all options */ + SO_READOPT = 0x0001, /* Set the read mode */ + SO_WROFF = 0x0002, /* Insert an offset in write M_DATA mblks */ + SO_MINPSZ = 0x0004, /* Change the min packet size on sth rq */ + SO_MAXPSZ = 0x0008, /* Change the max packet size on sth rq */ + SO_HIWAT = 0x0010, /* Change the high water mark on sth rq */ + SO_LOWAT = 0x0020, /* Change the low water mark */ + SO_MREADON = 0x0040, /* Request M_READ messages */ + SO_MREADOFF = 0x0080, /* Don't gen M_READ messages */ + SO_NDELON = 0x0100, /* old TTY semantics for O_NDELAY reads and writes */ + SO_NDELOFF = 0x0200, /* STREAMS semantics for O_NDELAY reads and writes */ + SO_ISTTY = 0x0400, /* Become a controlling tty */ + SO_ISNTTY = 0x0800, /* No longer a controlling tty */ + SO_TOSTOP = 0x1000, /* Stop on background writes */ + SO_TONSTOP = 0x2000, /* Don't stop on background writes */ + SO_BAND = 0x4000, /* Water marks are for a band */ + SO_POLL_SET = 0x8000, /* Set events to poll */ + SO_POLL_CLR = 0x00010000 /* Clear events to poll */ +}; + +/* Buffer Allocation Priority */ +enum { + BPRI_LO = 1, + BPRI_MED = 2, + BPRI_HI = 3 +}; + +enum { + INFPSZ = -1 +}; + + +/** Test whether message is a data message */ +#define datamsg(type) ((type) == M_DATA || (type) == M_PROTO || (type) == M_PCPROTO || (type) == M_DELAY) + +enum { + CLONEOPEN = 0x02, + MODOPEN = 0x01, + OPENFAIL = -1 +}; + + +/* Enumeration values for strqget and strqset */ +typedef SInt32 qfields; +enum { + QHIWAT = 0, + QLOWAT = 1, + QMAXPSZ = 2, + QMINPSZ = 3, + QCOUNT = 4, + QFIRST = 5, + QLAST = 6, + QFLAG = 7, + QBAD = 8 +}; + + +typedef qfields qfields_t; +#endif /* CALL_NOT_IN_CARBON */ + +/* ***** From the Mentat "stropts.h" ******/ + + +enum { + I_NREAD = ((MIOC_STREAMIO << 8) | 1), /* return the number of bytes in 1st msg */ + I_PUSH = ((MIOC_STREAMIO << 8) | 2), /* push module just below stream head */ + I_POP = ((MIOC_STREAMIO << 8) | 3), /* pop module below stream head */ + I_LOOK = ((MIOC_STREAMIO << 8) | 4), /* retrieve name of first stream module */ + I_FLUSH = ((MIOC_STREAMIO << 8) | 5), /* flush all input and/or output queues */ + I_SRDOPT = ((MIOC_STREAMIO << 8) | 6), /* set the read mode */ + I_GRDOPT = ((MIOC_STREAMIO << 8) | 7), /* get the current read mode */ + I_STR = ((MIOC_STREAMIO << 8) | 8), /* create an internal ioctl message */ + I_SETSIG = ((MIOC_STREAMIO << 8) | 9), /* request SIGPOLL signal on events */ + I_GETSIG = ((MIOC_STREAMIO << 8) | 10), /* query the registered events */ + I_FIND = ((MIOC_STREAMIO << 8) | 11), /* check for module in stream */ + I_LINK = ((MIOC_STREAMIO << 8) | 12), /* connect stream under mux fd */ + I_UNLINK = ((MIOC_STREAMIO << 8) | 13), /* disconnect two streams */ + I_PEEK = ((MIOC_STREAMIO << 8) | 15), /* peek at data on read queue */ + I_FDINSERT = ((MIOC_STREAMIO << 8) | 16), /* create a message and send downstream */ + I_SENDFD = ((MIOC_STREAMIO << 8) | 17), /* send an fd to a connected pipe stream */ + I_RECVFD = ((MIOC_STREAMIO << 8) | 18), /* retrieve a file descriptor */ + I_FLUSHBAND = ((MIOC_STREAMIO << 8) | 19), /* flush a particular input and/or output band */ + I_SWROPT = ((MIOC_STREAMIO << 8) | 20), /* set the write mode */ + I_GWROPT = ((MIOC_STREAMIO << 8) | 21), /* get the current write mode */ + I_LIST = ((MIOC_STREAMIO << 8) | 22), /* get a list of all modules on a stream */ + I_ATMARK = ((MIOC_STREAMIO << 8) | 23), /* check to see if the next message is "marked" */ + I_CKBAND = ((MIOC_STREAMIO << 8) | 24), /* check for a message of a particular band */ + I_GETBAND = ((MIOC_STREAMIO << 8) | 25), /* get the band of the next message to be read */ + I_CANPUT = ((MIOC_STREAMIO << 8) | 26), /* check to see if a message may be passed on a stream */ + I_SETCLTIME = ((MIOC_STREAMIO << 8) | 27), /* set the close timeout wait */ + I_GETCLTIME = ((MIOC_STREAMIO << 8) | 28), /* get the current close timeout wait */ + I_PLINK = ((MIOC_STREAMIO << 8) | 29), /* permanently connect a stream under a mux */ + I_PUNLINK = ((MIOC_STREAMIO << 8) | 30), /* disconnect a permanent link */ + I_GETMSG = ((MIOC_STREAMIO << 8) | 40), /* getmsg() system call */ + I_PUTMSG = ((MIOC_STREAMIO << 8) | 41), /* putmsg() system call */ + I_POLL = ((MIOC_STREAMIO << 8) | 42), /* poll() system call */ + I_SETDELAY = ((MIOC_STREAMIO << 8) | 43), /* set blocking status */ + I_GETDELAY = ((MIOC_STREAMIO << 8) | 44), /* get blocking status */ + I_RUN_QUEUES = ((MIOC_STREAMIO << 8) | 45), /* sacrifice for the greater good */ + I_GETPMSG = ((MIOC_STREAMIO << 8) | 46), /* getpmsg() system call */ + I_PUTPMSG = ((MIOC_STREAMIO << 8) | 47), /* putpmsg() system call */ + I_AUTOPUSH = ((MIOC_STREAMIO << 8) | 48), /* for systems that cannot do the autopush in open */ + I_PIPE = ((MIOC_STREAMIO << 8) | 49), /* for pipe library call */ + I_HEAP_REPORT = ((MIOC_STREAMIO << 8) | 50), /* get heap statistics */ + I_FIFO = ((MIOC_STREAMIO << 8) | 51) /* for fifo library call */ +}; + +/* priority message request on putmsg() or strpeek */ +enum { + RS_HIPRI = 0x01 +}; + +/* flags for getpmsg and putpmsg */ +enum { + MSG_HIPRI = 0x01, + MSG_BAND = 0x02, /* Retrieve a message from a particular band */ + MSG_ANY = 0x04 /* Retrieve a message from any band */ +}; + +/* return values from getmsg(), 0 indicates all ok */ +enum { + MORECTL = 0x01, /* more control info available */ + MOREDATA = 0x02 /* more data available */ +}; + + +enum { + FMNAMESZ = 31 /* maximum length of a module or device name */ +}; + + +/* Infinite poll wait time */ +enum { + INFTIM = (unsigned long)0xFFFFFFFF +}; + +/* flush requests */ +enum { + FLUSHR = 0x01, /* Flush the read queue */ + FLUSHW = 0x02, /* Flush the write queue */ + FLUSHRW = (FLUSHW | FLUSHR) /* Flush both */ +}; + +enum { + FLUSHBAND = 0x40 /* Flush a particular band */ +}; + +/* I_FLUSHBAND */ +struct bandinfo { + unsigned char bi_pri; /* Band to flush */ + char pad1; + SInt32 bi_flag; /* One of the above flush requests */ +}; +typedef struct bandinfo bandinfo; +/* flags for I_ATMARK */ +enum { + ANYMARK = 0x01, /* Check if message is marked */ + LASTMARK = 0x02 /* Check if this is the only message marked */ +}; + +/* signal event masks */ +enum { + S_INPUT = 0x01, /* A non-M_PCPROTO message has arrived */ + S_HIPRI = 0x02, /* A priority (M_PCPROTO) message is available */ + S_OUTPUT = 0x04, /* The write queue is no longer full */ + S_MSG = 0x08, /* A signal message has reached the front of read queue */ + S_RDNORM = 0x10, /* A non-priority message is available */ + S_RDBAND = 0x20, /* A banded messsage is available */ + S_WRNORM = 0x40, /* Same as S_OUTPUT */ + S_WRBAND = 0x80, /* A priority band exists and is writable */ + S_ERROR = 0x0100, /* Error message has arrived */ + S_HANGUP = 0x0200, /* Hangup message has arrived */ + S_BANDURG = 0x0400 /* Use SIGURG instead of SIGPOLL on S_RDBAND signals */ +}; + +/* read mode bits for I_S|GRDOPT; choose one of the following */ +enum { + RNORM = 0x01, /* byte-stream mode, default */ + RMSGD = 0x02, /* message-discard mode */ + RMSGN = 0x04, /* message-nondiscard mode */ + RFILL = 0x08 /* fill read buffer mode (PSE private) */ +}; + +/* More read modes, these are bitwise or'ed with the modes above */ +enum { + RPROTNORM = 0x10, /* Normal handling of M_PROTO/M_PCPROTO messages, default */ + RPROTDIS = 0x20, /* Discard M_PROTO/M_PCPROTO message blocks */ + RPROTDAT = 0x40 /* Convert M_PROTO/M_PCPROTO message blocks into M_DATA */ +}; + +/* write modes for I_S|GWROPT */ +enum { + SNDZERO = 0x01 /* Send a zero-length message downstream on a write of zero bytes */ +}; + +enum { + MUXID_ALL = -1 /* Unlink all lower streams for I_UNLINK and I_PUNLINK */ +}; + +/* + strbuf is moved to "OpenTransport.h" because that header file + exports provider routines that take it as a parameter. +*/ + +/* structure of ioctl data on I_FDINSERT */ +struct strfdinsert { + strbuf ctlbuf; + strbuf databuf; + long flags; /* type of message, 0 or RS_HIPRI */ + long fildes; /* fd of other stream (FDCELL) */ + SInt32 offset; /* where to put other stream read qp */ +}; +typedef struct strfdinsert strfdinsert; +/* I_LIST structures */ +struct str_mlist { + char l_name[32]; +}; +typedef struct str_mlist str_mlist; +struct str_list { + SInt32 sl_nmods; /* number of modules in sl_modlist array */ + str_mlist * sl_modlist; +}; +typedef struct str_list str_list; +/* I_PEEK structure */ +struct strpeek { + strbuf ctlbuf; + strbuf databuf; + long flags; /* if RS_HIPRI, get priority messages only */ +}; +typedef struct strpeek strpeek; +/* structure for getpmsg and putpmsg */ +struct strpmsg { + strbuf ctlbuf; + strbuf databuf; + SInt32 band; + long flags; +}; +typedef struct strpmsg strpmsg; +/* structure of ioctl data on I_RECVFD */ +struct strrecvfd { + long fd; /* new file descriptor (FDCELL) */ + unsigned short uid; /* user id of sending stream */ + unsigned short gid; + char fill[8]; +}; +typedef struct strrecvfd strrecvfd; +/* structure of ioctl data on I_STR */ +struct strioctl { + SInt32 ic_cmd; /* downstream command */ + SInt32 ic_timout; /* ACK/NAK timeout */ + SInt32 ic_len; /* length of data arg */ + char * ic_dp; /* ptr to data arg */ +}; +typedef struct strioctl strioctl; +/* ***** From the Mentat "strlog.h" ******/ + +struct log_ctl { + short mid; + short sid; + char level; + char pad1; + short flags; + long ltime; + long ttime; + SInt32 seq_no; +}; +typedef struct log_ctl log_ctl; +enum { + SL_FATAL = 0x01, /* Fatal error */ + SL_NOTIFY = 0x02, /* Notify the system administrator */ + SL_ERROR = 0x04, /* Pass message to error logger */ + SL_TRACE = 0x08, /* Pass message to tracer */ + SL_CONSOLE = 0x00, /* Console messages are disabled */ + SL_WARN = 0x20, /* Warning */ + SL_NOTE = 0x40 /* Notice this message */ +}; + +struct trace_ids { + short ti_mid; + short ti_sid; + char ti_level; +}; +typedef struct trace_ids trace_ids; +enum { + I_TRCLOG = ((MIOC_STRLOG << 8) | 1), + I_ERRLOG = ((MIOC_STRLOG << 8) | 2) +}; + +enum { + LOGMSGSZ = 128 +}; + +/* ***** From the Mentat "tihdr.h" ******/ + +#if CALL_NOT_IN_CARBON + +/* TPI Primitives*/ + + + +enum { + T_BIND_REQ = 101, + T_CONN_REQ = 102, /* connection request */ + T_CONN_RES = 103, /* respond to connection indication */ + T_DATA_REQ = 104, + T_DISCON_REQ = 105, + T_EXDATA_REQ = 106, + T_INFO_REQ = 107, + T_OPTMGMT_REQ = 108, + T_ORDREL_REQ = 109, + T_UNBIND_REQ = 110, + T_UNITDATA_REQ = 111, + T_ADDR_REQ = 112, /* Get address request */ + T_UREQUEST_REQ = 113, /* UnitRequest (transaction) req */ + T_REQUEST_REQ = 114, /* Request (CO transaction) req */ + T_UREPLY_REQ = 115, /* UnitRequest (transaction) req */ + T_REPLY_REQ = 116, /* REPLY (CO transaction) req */ + T_CANCELREQUEST_REQ = 117, /* Cancel outgoing request */ + T_CANCELREPLY_REQ = 118, /* Cancel incoming request */ + T_REGNAME_REQ = 119, /* Request name registration */ + T_DELNAME_REQ = 120, /* Request delete name registration */ + T_LKUPNAME_REQ = 121, /* Request name lookup */ + + T_BIND_ACK = 122, + T_CONN_CON = 123, /* connection confirmation */ + T_CONN_IND = 124, /* incoming connection indication */ + T_DATA_IND = 125, + T_DISCON_IND = 126, + T_ERROR_ACK = 127, + T_EXDATA_IND = 128, + T_INFO_ACK = 129, + T_OK_ACK = 130, + T_OPTMGMT_ACK = 131, + T_ORDREL_IND = 132, + T_UNITDATA_IND = 133, + T_UDERROR_IND = 134, + T_ADDR_ACK = 135, /* Get address ack */ + T_UREQUEST_IND = 136, /* UnitRequest (transaction) ind */ + T_REQUEST_IND = 137, /* Request (CO transaction) ind */ + T_UREPLY_IND = 138, /* Incoming unit reply */ + T_REPLY_IND = 139, /* Incoming reply */ + T_UREPLY_ACK = 140, /* outgoing Unit Reply is complete */ + T_REPLY_ACK = 141, /* outgoing Reply is complete */ + T_RESOLVEADDR_REQ = 142, + T_RESOLVEADDR_ACK = 143, + + T_LKUPNAME_CON = 146, /* Results of name lookup */ + T_LKUPNAME_RES = 147, /* Partial results of name lookup */ + T_REGNAME_ACK = 148, /* Request name registration */ + T_SEQUENCED_ACK = 149, /* Sequenced version of OK or ERROR ACK */ + + T_EVENT_IND = 160 /* Miscellaneous event Indication */ +}; + +/* State values */ +enum { + TS_UNBND = 1, + TS_WACK_BREQ = 2, + TS_WACK_UREQ = 3, + TS_IDLE = 4, + TS_WACK_OPTREQ = 5, + TS_WACK_CREQ = 6, + TS_WCON_CREQ = 7, + TS_WRES_CIND = 8, + TS_WACK_CRES = 9, + TS_DATA_XFER = 10, + TS_WIND_ORDREL = 11, + TS_WREQ_ORDREL = 12, + TS_WACK_DREQ6 = 13, + TS_WACK_DREQ7 = 14, + TS_WACK_DREQ9 = 15, + TS_WACK_DREQ10 = 16, + TS_WACK_DREQ11 = 17, + TS_WACK_ORDREL = 18, + TS_NOSTATES = 19, + TS_BAD_STATE = 19 +}; + +/* Transport events */ +enum { + TE_OPENED = 1, + TE_BIND = 2, + TE_OPTMGMT = 3, + TE_UNBIND = 4, + TE_CLOSED = 5, + TE_CONNECT1 = 6, + TE_CONNECT2 = 7, + TE_ACCEPT1 = 8, + TE_ACCEPT2 = 9, + TE_ACCEPT3 = 10, + TE_SND = 11, + TE_SNDDIS1 = 12, + TE_SNDDIS2 = 13, + TE_SNDREL = 14, + TE_SNDUDATA = 15, + TE_LISTEN = 16, + TE_RCVCONNECT = 17, + TE_RCV = 18, + TE_RCVDIS1 = 19, + TE_RCVDIS2 = 20, + TE_RCVDIS3 = 21, + TE_RCVREL = 22, + TE_RCVUDATA = 23, + TE_RCVUDERR = 24, + TE_PASS_CONN = 25, + TE_BAD_EVENT = 26 +}; + +struct T_addr_ack { + long PRIM_type; /* Always T_ADDR_ACK */ + long LOCADDR_length; + long LOCADDR_offset; + long REMADDR_length; + long REMADDR_offset; +}; +typedef struct T_addr_ack T_addr_ack; +struct T_addr_req { + long PRIM_type; /* Always T_ADDR_REQ */ +}; +typedef struct T_addr_req T_addr_req; +struct T_bind_ack { + long PRIM_type; /* always T_BIND_ACK */ + long ADDR_length; + long ADDR_offset; + unsigned long CONIND_number; +}; +typedef struct T_bind_ack T_bind_ack; +struct T_bind_req { + long PRIM_type; /* always T_BIND_REQ */ + long ADDR_length; + long ADDR_offset; + unsigned long CONIND_number; +}; +typedef struct T_bind_req T_bind_req; +struct T_conn_con { + long PRIM_type; /* always T_CONN_CON */ + long RES_length; /* responding address length */ + long RES_offset; + long OPT_length; + long OPT_offset; +}; +typedef struct T_conn_con T_conn_con; +struct T_conn_ind { + long PRIM_type; /* always T_CONN_IND */ + long SRC_length; + long SRC_offset; + long OPT_length; + long OPT_offset; + long SEQ_number; +}; +typedef struct T_conn_ind T_conn_ind; +struct T_conn_req { + long PRIM_type; /* always T_CONN_REQ */ + long DEST_length; + long DEST_offset; + long OPT_length; + long OPT_offset; +}; +typedef struct T_conn_req T_conn_req; +struct T_conn_res { + long PRIM_type; /* always T_CONN_RES */ + queue_t * QUEUE_ptr; + long OPT_length; + long OPT_offset; + long SEQ_number; +}; +typedef struct T_conn_res T_conn_res; +struct T_data_ind { + long PRIM_type; /* always T_DATA_IND */ + long MORE_flag; +}; +typedef struct T_data_ind T_data_ind; +struct T_data_req { + long PRIM_type; /* always T_DATA_REQ */ + long MORE_flag; +}; +typedef struct T_data_req T_data_req; +struct T_discon_ind { + long PRIM_type; /* always T_DISCON_IND */ + long DISCON_reason; + long SEQ_number; +}; +typedef struct T_discon_ind T_discon_ind; +struct T_discon_req { + long PRIM_type; /* always T_DISCON_REQ */ + long SEQ_number; +}; +typedef struct T_discon_req T_discon_req; +struct T_exdata_ind { + long PRIM_type; /* always T_EXDATA_IND */ + long MORE_flag; +}; +typedef struct T_exdata_ind T_exdata_ind; +struct T_exdata_req { + long PRIM_type; /* always T_EXDATA_REQ */ + long MORE_flag; +}; +typedef struct T_exdata_req T_exdata_req; +struct T_error_ack { + long PRIM_type; /* always T_ERROR_ACK */ + long ERROR_prim; /* primitive in error */ + long TLI_error; + long UNIX_error; +}; +typedef struct T_error_ack T_error_ack; +struct T_info_ack { + long PRIM_type; /* always T_INFO_ACK */ + long TSDU_size; /* max TSDU size */ + long ETSDU_size; /* max ETSDU size */ + long CDATA_size; /* connect data size */ + long DDATA_size; /* disconnect data size */ + long ADDR_size; /* TSAP size */ + long OPT_size; /* options size */ + long TIDU_size; /* TIDU size */ + long SERV_type; /* service type */ + long CURRENT_state; /* current state */ + long PROVIDER_flag; /* provider flags (see xti.h for defines) */ +}; +typedef struct T_info_ack T_info_ack; +/* Provider flags */ +enum { + SENDZERO = 0x0001, /* supports 0-length TSDU's */ + XPG4_1 = 0x0002 /* provider supports recent stuff */ +}; + +struct T_info_req { + long PRIM_type; /* always T_INFO_REQ */ +}; +typedef struct T_info_req T_info_req; +struct T_ok_ack { + long PRIM_type; /* always T_OK_ACK */ + long CORRECT_prim; +}; +typedef struct T_ok_ack T_ok_ack; +struct T_optmgmt_ack { + long PRIM_type; /* always T_OPTMGMT_ACK */ + long OPT_length; + long OPT_offset; + long MGMT_flags; +}; +typedef struct T_optmgmt_ack T_optmgmt_ack; +struct T_optmgmt_req { + long PRIM_type; /* always T_OPTMGMT_REQ */ + long OPT_length; + long OPT_offset; + long MGMT_flags; +}; +typedef struct T_optmgmt_req T_optmgmt_req; +struct T_ordrel_ind { + long PRIM_type; /* always T_ORDREL_IND */ +}; +typedef struct T_ordrel_ind T_ordrel_ind; +struct T_ordrel_req { + long PRIM_type; /* always T_ORDREL_REQ */ +}; +typedef struct T_ordrel_req T_ordrel_req; +struct T_unbind_req { + long PRIM_type; /* always T_UNBIND_REQ */ +}; +typedef struct T_unbind_req T_unbind_req; +struct T_uderror_ind { + long PRIM_type; /* always T_UDERROR_IND */ + long DEST_length; + long DEST_offset; + long OPT_length; + long OPT_offset; + long ERROR_type; +}; +typedef struct T_uderror_ind T_uderror_ind; +struct T_unitdata_ind { + long PRIM_type; /* always T_UNITDATA_IND */ + long SRC_length; + long SRC_offset; + long OPT_length; + long OPT_offset; +}; +typedef struct T_unitdata_ind T_unitdata_ind; +struct T_unitdata_req { + long PRIM_type; /* always T_UNITDATA_REQ */ + long DEST_length; + long DEST_offset; + long OPT_length; + long OPT_offset; +}; +typedef struct T_unitdata_req T_unitdata_req; +struct T_resolveaddr_ack { + long PRIM_type; /* always T_RESOLVEADDR_ACK */ + long SEQ_number; + long ADDR_length; + long ADDR_offset; + long ORIG_client; + long ORIG_data; + long TLI_error; + long UNIX_error; +}; +typedef struct T_resolveaddr_ack T_resolveaddr_ack; +struct T_resolveaddr_req { + long PRIM_type; /* always T_RESOLVEADDR_REQ */ + long SEQ_number; + long ADDR_length; + long ADDR_offset; + long ORIG_client; + long ORIG_data; + long MAX_milliseconds; +}; +typedef struct T_resolveaddr_req T_resolveaddr_req; +struct T_unitreply_ind { + long PRIM_type; /* Always T_UREPLY_IND */ + long SEQ_number; + long OPT_length; + long OPT_offset; + long REP_flags; + long TLI_error; + long UNIX_error; +}; +typedef struct T_unitreply_ind T_unitreply_ind; +struct T_unitrequest_ind { + long PRIM_type; /* Always T_UREQUEST_IND */ + long SEQ_number; + long SRC_length; + long SRC_offset; + long OPT_length; + long OPT_offset; + long REQ_flags; +}; +typedef struct T_unitrequest_ind T_unitrequest_ind; +struct T_unitrequest_req { + long PRIM_type; /* Always T_UREQUEST_REQ */ + long SEQ_number; + long DEST_length; + long DEST_offset; + long OPT_length; + long OPT_offset; + long REQ_flags; +}; +typedef struct T_unitrequest_req T_unitrequest_req; +struct T_unitreply_req { + long PRIM_type; /* Always T_UREPLY_REQ */ + long SEQ_number; + long OPT_length; + long OPT_offset; + long REP_flags; +}; +typedef struct T_unitreply_req T_unitreply_req; +struct T_unitreply_ack { + long PRIM_type; /* Always T_UREPLY_ACK */ + long SEQ_number; + long TLI_error; + long UNIX_error; +}; +typedef struct T_unitreply_ack T_unitreply_ack; +struct T_cancelrequest_req { + long PRIM_type; /* Always T_CANCELREQUEST_REQ */ + long SEQ_number; +}; +typedef struct T_cancelrequest_req T_cancelrequest_req; +struct T_cancelreply_req { + long PRIM_type; /* Always T_CANCELREPLY_REQ */ + long SEQ_number; +}; +typedef struct T_cancelreply_req T_cancelreply_req; +struct T_reply_ind { + long PRIM_type; /* Always T_REPLY_IND */ + long SEQ_number; + long OPT_length; + long OPT_offset; + long REP_flags; + long TLI_error; + long UNIX_error; +}; +typedef struct T_reply_ind T_reply_ind; +struct T_request_ind { + long PRIM_type; /* Always T_REQUEST_IND */ + long SEQ_number; + long OPT_length; + long OPT_offset; + long REQ_flags; +}; +typedef struct T_request_ind T_request_ind; +struct T_request_req { + long PRIM_type; /* Always T_REQUEST_REQ */ + long SEQ_number; + long OPT_length; + long OPT_offset; + long REQ_flags; +}; +typedef struct T_request_req T_request_req; +struct T_reply_req { + long PRIM_type; /* Always T_REPLY_REQ */ + long SEQ_number; + long OPT_length; + long OPT_offset; + long REP_flags; +}; +typedef struct T_reply_req T_reply_req; +struct T_reply_ack { + long PRIM_type; /* Always T_REPLY_ACK */ + long SEQ_number; + long TLI_error; + long UNIX_error; +}; +typedef struct T_reply_ack T_reply_ack; +struct T_regname_req { + long PRIM_type; /* Always T_REGNAME_REQ */ + long SEQ_number; /* Reply is sequence ack */ + long NAME_length; + long NAME_offset; + long ADDR_length; + long ADDR_offset; + long REQ_flags; +}; +typedef struct T_regname_req T_regname_req; +struct T_regname_ack { + long PRIM_type; /* always T_REGNAME_ACK */ + long SEQ_number; + long REG_id; + long ADDR_length; + long ADDR_offset; +}; +typedef struct T_regname_ack T_regname_ack; +struct T_delname_req { + long PRIM_type; /* Always T_DELNAME_REQ */ + long SEQ_number; /* Reply is sequence ack */ + long NAME_length; + long NAME_offset; +}; +typedef struct T_delname_req T_delname_req; +struct T_lkupname_req { + long PRIM_type; /* Always T_LKUPNAME_REQ */ + long SEQ_number; /* Reply is sequence ack */ + long NAME_length; /* ... or T_LKUPNAME_CON */ + long NAME_offset; + long ADDR_length; + long ADDR_offset; + long MAX_number; + long MAX_milliseconds; + long REQ_flags; +}; +typedef struct T_lkupname_req T_lkupname_req; +struct T_lkupname_con { + long PRIM_type; /* Either T_LKUPNAME_CON */ + long SEQ_number; /* Or T_LKUPNAME_RES */ + long NAME_length; + long NAME_offset; + long RSP_count; + long RSP_cumcount; +}; +typedef struct T_lkupname_con T_lkupname_con; +struct T_sequence_ack { + long PRIM_type; /* always T_SEQUENCED_ACK */ + long ORIG_prim; /* original primitive */ + long SEQ_number; + long TLI_error; + long UNIX_error; +}; +typedef struct T_sequence_ack T_sequence_ack; +struct T_event_ind { + long PRIM_type; /* always T_EVENT_IND */ + long EVENT_code; + long EVENT_cookie; +}; +typedef struct T_event_ind T_event_ind; +union T_primitives { + long type; + + long primType; + T_addr_ack taddrack; + T_bind_ack tbindack; + T_bind_req tbindreq; + T_conn_con tconncon; + T_conn_ind tconnind; + T_conn_req tconnreq; + T_conn_res tconnres; + T_data_ind tdataind; + T_data_req tdatareq; + T_discon_ind tdisconind; + T_discon_req tdisconreq; + T_exdata_ind texdataind; + T_exdata_req texdatareq; + T_error_ack terrorack; + T_info_ack tinfoack; + T_info_req tinforeq; + T_ok_ack tokack; + T_optmgmt_ack toptmgmtack; + T_optmgmt_req toptmgmtreq; + T_ordrel_ind tordrelind; + T_ordrel_req tordrelreq; + T_unbind_req tunbindreq; + T_uderror_ind tuderrorind; + T_unitdata_ind tunitdataind; + T_unitdata_req tunitdatareq; + T_unitreply_ind tunitreplyind; + T_unitrequest_ind tunitrequestind; + T_unitrequest_req tunitrequestreq; + T_unitreply_req tunitreplyreq; + T_unitreply_ack tunitreplyack; + T_reply_ind treplyind; + T_request_ind trequestind; + T_request_req trequestreq; + T_reply_req treplyreq; + T_reply_ack treplyack; + T_cancelrequest_req tcancelreqreq; + T_resolveaddr_req tresolvereq; + T_resolveaddr_ack tresolveack; + T_regname_req tregnamereq; + T_regname_ack tregnameack; + T_delname_req tdelnamereq; + T_lkupname_req tlkupnamereq; + T_lkupname_con tlkupnamecon; + T_sequence_ack tsequenceack; + T_event_ind teventind; +}; +typedef union T_primitives T_primitives; +/* ***** From the Mentat "dlpi.h" ******/ + +/* + This header file has encoded the values so an existing driver + or user which was written with the Logical Link Interface(LLI) + can migrate to the DLPI interface in a binary compatible manner. + Any fields which require a specific format or value are flagged + with a comment containing the message LLI compatibility. +*/ + +/* DLPI revision definition history*/ + +enum { + DL_CURRENT_VERSION = 0x02, /* current version of dlpi */ + DL_VERSION_2 = 0x02 /* version of dlpi March 12,1991 */ +}; + + +enum { + DL_INFO_REQ = 0x00, /* Information Req, LLI compatibility */ + DL_INFO_ACK = 0x03, /* Information Ack, LLI compatibility */ + DL_ATTACH_REQ = 0x0B, /* Attach a PPA */ + DL_DETACH_REQ = 0x0C, /* Detach a PPA */ + DL_BIND_REQ = 0x01, /* Bind dlsap address, LLI compatibility */ + DL_BIND_ACK = 0x04, /* Dlsap address bound, LLI compatibility */ + DL_UNBIND_REQ = 0x02, /* Unbind dlsap address, LLI compatibility */ + DL_OK_ACK = 0x06, /* Success acknowledgment, LLI compatibility */ + DL_ERROR_ACK = 0x05, /* Error acknowledgment, LLI compatibility */ + DL_SUBS_BIND_REQ = 0x1B, /* Bind Subsequent DLSAP address */ + DL_SUBS_BIND_ACK = 0x1C, /* Subsequent DLSAP address bound */ + DL_SUBS_UNBIND_REQ = 0x15, /* Subsequent unbind */ + DL_ENABMULTI_REQ = 0x1D, /* Enable multicast addresses */ + DL_DISABMULTI_REQ = 0x1E, /* Disable multicast addresses */ + DL_PROMISCON_REQ = 0x1F, /* Turn on promiscuous mode */ + DL_PROMISCOFF_REQ = 0x20, /* Turn off promiscuous mode */ + DL_UNITDATA_REQ = 0x07, /* datagram send request, LLI compatibility */ + DL_UNITDATA_IND = 0x08, /* datagram receive indication, LLI compatibility */ + DL_UDERROR_IND = 0x09, /* datagram error indication, LLI compatibility */ + DL_UDQOS_REQ = 0x0A, /* set QOS for subsequent datagram transmissions */ + DL_CONNECT_REQ = 0x0D, /* Connect request */ + DL_CONNECT_IND = 0x0E, /* Incoming connect indication */ + DL_CONNECT_RES = 0x0F, /* Accept previous connect indication */ + DL_CONNECT_CON = 0x10, /* Connection established */ + DL_TOKEN_REQ = 0x11, /* Passoff token request */ + DL_TOKEN_ACK = 0x12, /* Passoff token ack */ + DL_DISCONNECT_REQ = 0x13, /* Disconnect request */ + DL_DISCONNECT_IND = 0x14, /* Disconnect indication */ + DL_RESET_REQ = 0x17, /* Reset service request */ + DL_RESET_IND = 0x18, /* Incoming reset indication */ + DL_RESET_RES = 0x19, /* Complete reset processing */ + DL_RESET_CON = 0x1A, /* Reset processing complete */ + DL_DATA_ACK_REQ = 0x21, /* data unit transmission request */ + DL_DATA_ACK_IND = 0x22, /* Arrival of a command PDU */ + DL_DATA_ACK_STATUS_IND = 0x23, /* Status indication of DATA_ACK_REQ*/ + DL_REPLY_REQ = 0x24, /* Request a DLSDU from the remote */ + DL_REPLY_IND = 0x25, /* Arrival of a command PDU */ + DL_REPLY_STATUS_IND = 0x26, /* Status indication of REPLY_REQ */ + DL_REPLY_UPDATE_REQ = 0x27, /* Hold a DLSDU for transmission */ + DL_REPLY_UPDATE_STATUS_IND = 0x28, /* Status of REPLY_UPDATE req */ + DL_XID_REQ = 0x29, /* Request to send an XID PDU */ + DL_XID_IND = 0x2A, /* Arrival of an XID PDU */ + DL_XID_RES = 0x2B, /* request to send a response XID PDU*/ + DL_XID_CON = 0x2C, /* Arrival of a response XID PDU */ + DL_TEST_REQ = 0x2D, /* TEST command request */ + DL_TEST_IND = 0x2E, /* TEST response indication */ + DL_TEST_RES = 0x2F, /* TEST response */ + DL_TEST_CON = 0x30, /* TEST Confirmation */ + DL_PHYS_ADDR_REQ = 0x31, /* Request to get physical addr */ + DL_PHYS_ADDR_ACK = 0x32, /* Return physical addr */ + DL_SET_PHYS_ADDR_REQ = 0x33, /* set physical addr */ + DL_GET_STATISTICS_REQ = 0x34, /* Request to get statistics */ + DL_GET_STATISTICS_ACK = 0x35 /* Return statistics */ +}; + +/* DLPI interface states*/ +enum { + DL_UNATTACHED = 0x04, /* PPA not attached */ + DL_ATTACH_PENDING = 0x05, /* Waiting ack of DL_ATTACH_REQ */ + DL_DETACH_PENDING = 0x06, /* Waiting ack of DL_DETACH_REQ */ + DL_UNBOUND = 0x00, /* PPA attached, LLI compatibility */ + DL_BIND_PENDING = 0x01, /* Waiting ack of DL_BIND_REQ, LLI compatibility */ + DL_UNBIND_PENDING = 0x02, /* Waiting ack of DL_UNBIND_REQ, LLI compatibility */ + DL_IDLE = 0x03, /* dlsap bound, awaiting use, LLI compatibility */ + DL_UDQOS_PENDING = 0x07, /* Waiting ack of DL_UDQOS_REQ */ + DL_OUTCON_PENDING = 0x08, /* outgoing connection, awaiting DL_CONN_CON */ + DL_INCON_PENDING = 0x09, /* incoming connection, awaiting DL_CONN_RES */ + DL_CONN_RES_PENDING = 0x0A, /* Waiting ack of DL_CONNECT_RES */ + DL_DATAXFER = 0x0B, /* connection-oriented data transfer */ + DL_USER_RESET_PENDING = 0x0C, /* user initiated reset, awaiting DL_RESET_CON */ + DL_PROV_RESET_PENDING = 0x0D, /* provider initiated reset, awaiting DL_RESET_RES */ + DL_RESET_RES_PENDING = 0x0E, /* Waiting ack of DL_RESET_RES */ + DL_DISCON8_PENDING = 0x0F, /* Waiting ack of DL_DISC_REQ when in DL_OUTCON_PENDING */ + DL_DISCON9_PENDING = 0x10, /* Waiting ack of DL_DISC_REQ when in DL_INCON_PENDING */ + DL_DISCON11_PENDING = 0x11, /* Waiting ack of DL_DISC_REQ when in DL_DATAXFER */ + DL_DISCON12_PENDING = 0x12, /* Waiting ack of DL_DISC_REQ when in DL_USER_RESET_PENDING */ + DL_DISCON13_PENDING = 0x13, /* Waiting ack of DL_DISC_REQ when in DL_DL_PROV_RESET_PENDING */ + DL_SUBS_BIND_PND = 0x14, /* Waiting ack of DL_SUBS_BIND_REQ */ + DL_SUBS_UNBIND_PND = 0x15 /* Waiting ack of DL_SUBS_UNBIND_REQ */ +}; + +/* DL_ERROR_ACK error return values*/ + +enum { + DL_ACCESS = 0x02, /* Improper permissions for request, LLI compatibility */ + DL_BADADDR = 0x01, /* DLSAP address in improper format or invalid */ + DL_BADCORR = 0x05, /* Sequence number not from outstanding DL_CONN_IND */ + DL_BADDATA = 0x06, /* User data exceeded provider limit */ + DL_BADPPA = 0x08, /* Specified PPA was invalid */ + DL_BADPRIM = 0x09, /* Primitive received is not known by DLS provider */ + DL_BADQOSPARAM = 0x0A, /* QOS parameters contained invalid values */ + DL_BADQOSTYPE = 0x0B, /* QOS structure type is unknown or unsupported */ + DL_BADSAP = 0x00, /* Bad LSAP selector, LLI compatibility */ + DL_BADTOKEN = 0x0C, /* Token used not associated with an active stream */ + DL_BOUND = 0x0D, /* Attempted second bind with dl_max_conind or */ + /* dl_conn_mgmt > 0 on same DLSAP or PPA */ + DL_INITFAILED = 0x0E, /* Physical Link initialization failed */ + DL_NOADDR = 0x0F, /* Provider couldn't allocate alternate address */ + DL_NOTINIT = 0x10, /* Physical Link not initialized */ + DL_OUTSTATE = 0x03, /* Primitive issued in improper state, LLI compatibility */ + DL_SYSERR = 0x04, /* UNIX system error occurred, LLI compatibility */ + DL_UNSUPPORTED = 0x07, /* Requested service not supplied by provider */ + DL_UNDELIVERABLE = 0x11, /* Previous data unit could not be delivered */ + DL_NOTSUPPORTED = 0x12, /* Primitive is known but not supported by DLS provider */ + DL_TOOMANY = 0x13, /* limit exceeded */ + DL_NOTENAB = 0x14, /* Promiscuous mode not enabled */ + DL_BUSY = 0x15, /* Other streams for a particular PPA in the post-attached state */ + DL_NOAUTO = 0x16, /* Automatic handling of XID & TEST responses not supported */ + DL_NOXIDAUTO = 0x17, /* Automatic handling of XID not supported */ + DL_NOTESTAUTO = 0x18, /* Automatic handling of TEST not supported */ + DL_XIDAUTO = 0x19, /* Automatic handling of XID response */ + DL_TESTAUTO = 0x1A, /* AUtomatic handling of TEST response*/ + DL_PENDING = 0x1B /* pending outstanding connect indications */ +}; + +/* DLPI media types supported*/ + +enum { + DL_CSMACD = 0x00, /* IEEE 802.3 CSMA/CD network, LLI Compatibility */ + DL_TPB = 0x01, /* IEEE 802.4 Token Passing Bus, LLI Compatibility */ + DL_TPR = 0x02, /* IEEE 802.5 Token Passing Ring, LLI Compatibility */ + DL_METRO = 0x03, /* IEEE 802.6 Metro Net, LLI Compatibility */ + DL_ETHER = 0x04, /* Ethernet Bus, LLI Compatibility */ + DL_HDLC = 0x05, /* ISO HDLC protocol support, bit synchronous */ + DL_CHAR = 0x06, /* Character Synchronous protocol support, eg BISYNC */ + DL_CTCA = 0x07, /* IBM Channel-to-Channel Adapter */ + DL_FDDI = 0x08, /* Fiber Distributed data interface */ + DL_OTHER = 0x09 /* Any other medium not listed above */ +}; + +/* + DLPI provider service supported. + These must be allowed to be bitwise-OR for dl_service_mode in + DL_INFO_ACK. +*/ +enum { + DL_CODLS = 0x01, /* support connection-oriented service */ + DL_CLDLS = 0x02, /* support connectionless data link service */ + DL_ACLDLS = 0x04 /* support acknowledged connectionless service*/ +}; + +/* + DLPI provider style. + The DLPI provider style which determines whether a provider + requires a DL_ATTACH_REQ to inform the provider which PPA + user messages should be sent/received on. +*/ + +enum { + DL_STYLE1 = 0x0500, /* PPA is implicitly bound by open(2) */ + DL_STYLE2 = 0x0501 /* PPA must be explicitly bound via DL_ATTACH_REQ */ +}; + +/* DLPI Originator for Disconnect and Resets*/ + +enum { + DL_PROVIDER = 0x0700, + DL_USER = 0x0701 +}; + +/* DLPI Disconnect Reasons*/ + +enum { + DL_CONREJ_DEST_UNKNOWN = 0x0800, + DL_CONREJ_DEST_UNREACH_PERMANENT = 0x0801, + DL_CONREJ_DEST_UNREACH_TRANSIENT = 0x0802, + DL_CONREJ_QOS_UNAVAIL_PERMANENT = 0x0803, + DL_CONREJ_QOS_UNAVAIL_TRANSIENT = 0x0804, + DL_CONREJ_PERMANENT_COND = 0x0805, + DL_CONREJ_TRANSIENT_COND = 0x0806, + DL_DISC_ABNORMAL_CONDITION = 0x0807, + DL_DISC_NORMAL_CONDITION = 0x0808, + DL_DISC_PERMANENT_CONDITION = 0x0809, + DL_DISC_TRANSIENT_CONDITION = 0x080A, + DL_DISC_UNSPECIFIED = 0x080B +}; + +/* DLPI Reset Reasons*/ + +enum { + DL_RESET_FLOW_CONTROL = 0x0900, + DL_RESET_LINK_ERROR = 0x0901, + DL_RESET_RESYNCH = 0x0902 +}; + +/* DLPI status values for acknowledged connectionless data transfer*/ + +enum { + DL_CMD_MASK = 0x0F, /* mask for command portion of status */ + DL_CMD_OK = 0x00, /* Command Accepted */ + DL_CMD_RS = 0x01, /* Unimplemented or inactivated service */ + DL_CMD_UE = 0x05, /* Data Link User interface error */ + DL_CMD_PE = 0x06, /* Protocol error */ + DL_CMD_IP = 0x07, /* Permanent implementation dependent error*/ + DL_CMD_UN = 0x09, /* Resources temporarily unavailable */ + DL_CMD_IT = 0x0F, /* Temporary implementation dependent error */ + DL_RSP_MASK = 0xF0, /* mask for response portion of status */ + DL_RSP_OK = 0x00, /* Response DLSDU present */ + DL_RSP_RS = 0x10, /* Unimplemented or inactivated service */ + DL_RSP_NE = 0x30, /* Response DLSDU never submitted */ + DL_RSP_NR = 0x40, /* Response DLSDU not requested */ + DL_RSP_UE = 0x50, /* Data Link User interface error */ + DL_RSP_IP = 0x70, /* Permanent implementation dependent error */ + DL_RSP_UN = 0x90, /* Resources temporarily unavailable */ + DL_RSP_IT = 0xF0 /* Temporary implementation dependent error */ +}; + +/* Service Class values for acknowledged connectionless data transfer*/ + +enum { + DL_RQST_RSP = 0x01, /* Use acknowledge capability in MAC sublayer*/ + DL_RQST_NORSP = 0x02 /* No acknowledgement service requested */ +}; + +/* DLPI address type definition*/ + +enum { + DL_FACT_PHYS_ADDR = 0x01, /* factory physical address */ + DL_CURR_PHYS_ADDR = 0x02 /* current physical address */ +}; + +/* DLPI flag definitions*/ + +enum { + DL_POLL_FINAL = 0x01 /* if set,indicates poll/final bit set*/ +}; + +/* XID and TEST responses supported by the provider*/ + +enum { + DL_AUTO_XID = 0x01, /* provider will respond to XID */ + DL_AUTO_TEST = 0x02 /* provider will respond to TEST */ +}; + +/* Subsequent bind type*/ + +enum { + DL_PEER_BIND = 0x01, /* subsequent bind on a peer addr */ + DL_HIERARCHICAL_BIND = 0x02 /* subs_bind on a hierarchical addr*/ +}; + +/* DLPI promiscuous mode definitions*/ + +enum { + DL_PROMISC_PHYS = 0x01, /* promiscuous mode at phys level */ + DL_PROMISC_SAP = 0x02, /* promiscous mode at sap level */ + DL_PROMISC_MULTI = 0x03 /* promiscuous mode for multicast */ +}; + +/* M_DATA "raw" mode */ +#define DLIOCRAW MIOC_CMD(MIOC_DLPI,1) +/* + DLPI Quality Of Service definition for use in QOS structure definitions. + The QOS structures are used in connection establishment, DL_INFO_ACK, + and setting connectionless QOS values. +*/ +/* + Throughput + + This parameter is specified for both directions. +*/ + +struct dl_through_t { + SInt32 dl_target_value; /* desired bits/second desired */ + SInt32 dl_accept_value; /* min. acceptable bits/second */ +}; +typedef struct dl_through_t dl_through_t; +/* + transit delay specification + + This parameter is specified for both directions. + expressed in milliseconds assuming a DLSDU size of 128 octets. + The scaling of the value to the current DLSDU size is provider dependent. +*/ +struct dl_transdelay_t { + SInt32 dl_target_value; /* desired value of service */ + SInt32 dl_accept_value; /* min. acceptable value of service */ +}; +typedef struct dl_transdelay_t dl_transdelay_t; +/* + priority specification + priority range is 0-100, with 0 being highest value. +*/ + +struct dl_priority_t { + SInt32 dl_min; + SInt32 dl_max; +}; +typedef struct dl_priority_t dl_priority_t; +/* protection specification*/ +enum { + DL_NONE = 0x0B01, /* no protection supplied */ + DL_MONITOR = 0x0B02, /* protection against passive monitoring */ + DL_MAXIMUM = 0x0B03 /* protection against modification, replay, addition, or deletion */ +}; + +struct dl_protect_t { + SInt32 dl_min; + SInt32 dl_max; +}; +typedef struct dl_protect_t dl_protect_t; +/* + Resilience specification + probabilities are scaled by a factor of 10,000 with a time interval + of 10,000 seconds. +*/ +struct dl_resilience_t { + SInt32 dl_disc_prob; /* probability of provider init DISC */ + SInt32 dl_reset_prob; /* probability of provider init RESET */ +}; +typedef struct dl_resilience_t dl_resilience_t; +/* + QOS type definition to be used for negotiation with the + remote end of a connection, or a connectionless unitdata request. + There are two type definitions to handle the negotiation + process at connection establishment. The typedef dl_qos_range_t + is used to present a range for parameters. This is used + in the DL_CONNECT_REQ and DL_CONNECT_IND messages. The typedef + dl_qos_sel_t is used to select a specific value for the QOS + parameters. This is used in the DL_CONNECT_RES, DL_CONNECT_CON, + and DL_INFO_ACK messages to define the selected QOS parameters + for a connection. + + NOTE + A DataLink provider which has unknown values for any of the fields + will use a value of DL_UNKNOWN for all values in the fields. + + NOTE + A QOS parameter value of DL_QOS_DONT_CARE informs the DLS + provider the user requesting this value doesn't care + what the QOS parameter is set to. This value becomes the + least possible value in the range of QOS parameters. + The order of the QOS parameter range is then: + + DL_QOS_DONT_CARE < 0 < MAXIMUM QOS VALUE +*/ +enum { + DL_UNKNOWN = -1, + DL_QOS_DONT_CARE = -2 +}; + +/* + Every QOS structure has the first 4 bytes containing a type + field, denoting the definition of the rest of the structure. + This is used in the same manner has the dl_primitive variable + is in messages. + + The following list is the defined QOS structure type values and structures. +*/ +enum { + DL_QOS_CO_RANGE1 = 0x0101, /* QOS range struct. for Connection modeservice */ + DL_QOS_CO_SEL1 = 0x0102, /* QOS selection structure */ + DL_QOS_CL_RANGE1 = 0x0103, /* QOS range struct. for connectionless*/ + DL_QOS_CL_SEL1 = 0x0104 /* QOS selection for connectionless mode*/ +}; + +struct dl_qos_co_range1_t { + UInt32 dl_qos_type; + dl_through_t dl_rcv_throughput; /* desired and acceptable*/ + dl_transdelay_t dl_rcv_trans_delay; /* desired and acceptable*/ + dl_through_t dl_xmt_throughput; + dl_transdelay_t dl_xmt_trans_delay; + dl_priority_t dl_priority; /* min and max values */ + dl_protect_t dl_protection; /* min and max values */ + SInt32 dl_residual_error; + dl_resilience_t dl_resilience; +}; +typedef struct dl_qos_co_range1_t dl_qos_co_range1_t; +struct dl_qos_co_sel1_t { + UInt32 dl_qos_type; + SInt32 dl_rcv_throughput; + SInt32 dl_rcv_trans_delay; + SInt32 dl_xmt_throughput; + SInt32 dl_xmt_trans_delay; + SInt32 dl_priority; + SInt32 dl_protection; + SInt32 dl_residual_error; + dl_resilience_t dl_resilience; +}; +typedef struct dl_qos_co_sel1_t dl_qos_co_sel1_t; +struct dl_qos_cl_range1_t { + UInt32 dl_qos_type; + dl_transdelay_t dl_trans_delay; + dl_priority_t dl_priority; + dl_protect_t dl_protection; + SInt32 dl_residual_error; +}; +typedef struct dl_qos_cl_range1_t dl_qos_cl_range1_t; +struct dl_qos_cl_sel1_t { + UInt32 dl_qos_type; + SInt32 dl_trans_delay; + SInt32 dl_priority; + SInt32 dl_protection; + SInt32 dl_residual_error; +}; +typedef struct dl_qos_cl_sel1_t dl_qos_cl_sel1_t; +/* + DLPI interface primitive definitions. + + Each primitive is sent as a stream message. It is possible that + the messages may be viewed as a sequence of bytes that have the + following form without any padding. The structure definition + of the following messages may have to change depending on the + underlying hardware architecture and crossing of a hardware + boundary with a different hardware architecture. + + Fields in the primitives having a name of the form + dl_reserved cannot be used and have the value of + binary zero, no bits turned on. + + Each message has the name defined followed by the + stream message type (M_PROTO, M_PCPROTO, M_DATA) + */ +/* LOCAL MANAGEMENT SERVICE PRIMITIVES*/ + +/* DL_INFO_REQ, M_PCPROTO type*/ + +struct dl_info_req_t { + UInt32 dl_primitive; /* set to DL_INFO_REQ */ +}; +typedef struct dl_info_req_t dl_info_req_t; +/* DL_INFO_ACK, M_PCPROTO type*/ +struct dl_info_ack_t { + UInt32 dl_primitive; /* set to DL_INFO_ACK */ + UInt32 dl_max_sdu; /* Max bytes in a DLSDU */ + UInt32 dl_min_sdu; /* Min bytes in a DLSDU */ + UInt32 dl_addr_length; /* length of DLSAP address */ + UInt32 dl_mac_type; /* type of medium supported*/ + UInt32 dl_reserved; /* value set to zero */ + UInt32 dl_current_state; /* state of DLPI interface */ + SInt32 dl_sap_length; /* current length of SAP part of dlsap address */ + UInt32 dl_service_mode; /* CO, CL or ACL */ + UInt32 dl_qos_length; /* length of qos values */ + UInt32 dl_qos_offset; /* offset from beg. of block*/ + UInt32 dl_qos_range_length; /* available range of qos */ + UInt32 dl_qos_range_offset; /* offset from beg. of block*/ + UInt32 dl_provider_style; /* style1 or style2 */ + UInt32 dl_addr_offset; /* offset of the dlsap addr */ + UInt32 dl_version; /* version number */ + UInt32 dl_brdcst_addr_length; /* length of broadcast addr */ + UInt32 dl_brdcst_addr_offset; /* offset from beg. of block*/ + UInt32 dl_growth; /* set to zero */ +}; +typedef struct dl_info_ack_t dl_info_ack_t; +/* DL_ATTACH_REQ, M_PROTO type*/ +struct dl_attach_req_t { + UInt32 dl_primitive; /* set to DL_ATTACH_REQ*/ + UInt32 dl_ppa; /* id of the PPA */ +}; +typedef struct dl_attach_req_t dl_attach_req_t; +/* DL_DETACH_REQ, M_PROTO type*/ +struct dl_detach_req_t { + UInt32 dl_primitive; /* set to DL_DETACH_REQ */ +}; +typedef struct dl_detach_req_t dl_detach_req_t; +/* DL_BIND_REQ, M_PROTO type*/ +struct dl_bind_req_t { + UInt32 dl_primitive; /* set to DL_BIND_REQ */ + UInt32 dl_sap; /* info to identify dlsap addr*/ + UInt32 dl_max_conind; /* max # of outstanding con_ind*/ + UInt16 dl_service_mode; /* CO, CL or ACL */ + UInt16 dl_conn_mgmt; /* if non-zero, is con-mgmt stream*/ + UInt32 dl_xidtest_flg; /* if set to 1 indicates automatic initiation of test and xid frames */ +}; +typedef struct dl_bind_req_t dl_bind_req_t; +/* DL_BIND_ACK, M_PCPROTO type*/ +struct dl_bind_ack_t { + UInt32 dl_primitive; /* DL_BIND_ACK */ + UInt32 dl_sap; /* DLSAP addr info */ + UInt32 dl_addr_length; /* length of complete DLSAP addr */ + UInt32 dl_addr_offset; /* offset from beginning of M_PCPROTO*/ + UInt32 dl_max_conind; /* allowed max. # of con-ind */ + UInt32 dl_xidtest_flg; /* responses supported by provider*/ +}; +typedef struct dl_bind_ack_t dl_bind_ack_t; +/* DL_SUBS_BIND_REQ, M_PROTO type*/ +struct dl_subs_bind_req_t { + UInt32 dl_primitive; /* DL_SUBS_BIND_REQ */ + UInt32 dl_subs_sap_offset; /* offset of subs_sap */ + UInt32 dl_subs_sap_length; /* length of subs_sap */ + UInt32 dl_subs_bind_class; /* peer or hierarchical */ +}; +typedef struct dl_subs_bind_req_t dl_subs_bind_req_t; +/* DL_SUBS_BIND_ACK, M_PCPROTO type*/ +struct dl_subs_bind_ack_t { + UInt32 dl_primitive; /* DL_SUBS_BIND_ACK */ + UInt32 dl_subs_sap_offset; /* offset of subs_sap */ + UInt32 dl_subs_sap_length; /* length of subs_sap */ +}; +typedef struct dl_subs_bind_ack_t dl_subs_bind_ack_t; +/* DL_UNBIND_REQ, M_PROTO type*/ +struct dl_unbind_req_t { + UInt32 dl_primitive; /* DL_UNBIND_REQ */ +}; +typedef struct dl_unbind_req_t dl_unbind_req_t; +/* DL_SUBS_UNBIND_REQ, M_PROTO type*/ +struct dl_subs_unbind_req_t { + UInt32 dl_primitive; /* DL_SUBS_UNBIND_REQ */ + UInt32 dl_subs_sap_offset; /* offset of subs_sap */ + UInt32 dl_subs_sap_length; /* length of subs_sap */ +}; +typedef struct dl_subs_unbind_req_t dl_subs_unbind_req_t; +/* DL_OK_ACK, M_PCPROTO type*/ +struct dl_ok_ack_t { + UInt32 dl_primitive; /* DL_OK_ACK */ + UInt32 dl_correct_primitive; /* primitive being acknowledged */ +}; +typedef struct dl_ok_ack_t dl_ok_ack_t; +/* DL_ERROR_ACK, M_PCPROTO type*/ +struct dl_error_ack_t { + UInt32 dl_primitive; /* DL_ERROR_ACK */ + UInt32 dl_error_primitive; /* primitive in error */ + UInt32 dl_errno; /* DLPI error code */ + UInt32 dl_unix_errno; /* UNIX system error code */ +}; +typedef struct dl_error_ack_t dl_error_ack_t; +/* DL_ENABMULTI_REQ, M_PROTO type*/ +struct dl_enabmulti_req_t { + UInt32 dl_primitive; /* DL_ENABMULTI_REQ */ + UInt32 dl_addr_length; /* length of multicast address */ + UInt32 dl_addr_offset; /* offset from beg. of M_PROTO block*/ +}; +typedef struct dl_enabmulti_req_t dl_enabmulti_req_t; +/* DL_DISABMULTI_REQ, M_PROTO type*/ +struct dl_disabmulti_req_t { + UInt32 dl_primitive; /* DL_DISABMULTI_REQ */ + UInt32 dl_addr_length; /* length of multicast address */ + UInt32 dl_addr_offset; /* offset from beg. of M_PROTO block*/ +}; +typedef struct dl_disabmulti_req_t dl_disabmulti_req_t; +/* DL_PROMISCON_REQ, M_PROTO type*/ +struct dl_promiscon_req_t { + UInt32 dl_primitive; /* DL_PROMISCON_REQ */ + UInt32 dl_level; /* physical,SAP level or ALL multicast*/ +}; +typedef struct dl_promiscon_req_t dl_promiscon_req_t; +/* DL_PROMISCOFF_REQ, M_PROTO type*/ +struct dl_promiscoff_req_t { + UInt32 dl_primitive; /* DL_PROMISCOFF_REQ */ + UInt32 dl_level; /* Physical,SAP level or ALL multicast*/ +}; +typedef struct dl_promiscoff_req_t dl_promiscoff_req_t; +/* Primitives to get and set the Physical address*/ +/* DL_PHYS_ADDR_REQ, M_PROTO type*/ + +struct dl_phys_addr_req_t { + UInt32 dl_primitive; /* DL_PHYS_ADDR_REQ */ + UInt32 dl_addr_type; /* factory or current physical addr */ +}; +typedef struct dl_phys_addr_req_t dl_phys_addr_req_t; +/* DL_PHYS_ADDR_ACK, M_PCPROTO type*/ +struct dl_phys_addr_ack_t { + UInt32 dl_primitive; /* DL_PHYS_ADDR_ACK */ + UInt32 dl_addr_length; /* length of the physical addr */ + UInt32 dl_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_phys_addr_ack_t dl_phys_addr_ack_t; +/* DL_SET_PHYS_ADDR_REQ, M_PROTO type*/ +struct dl_set_phys_addr_req_t { + UInt32 dl_primitive; /* DL_SET_PHYS_ADDR_REQ */ + UInt32 dl_addr_length; /* length of physical addr */ + UInt32 dl_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_set_phys_addr_req_t dl_set_phys_addr_req_t; +/* Primitives to get statistics*/ +/* DL_GET_STATISTICS_REQ, M_PROTO type*/ + +struct dl_get_statistics_req_t { + UInt32 dl_primitive; /* DL_GET_STATISTICS_REQ */ +}; +typedef struct dl_get_statistics_req_t dl_get_statistics_req_t; +/* DL_GET_STATISTICS_ACK, M_PCPROTO type*/ +struct dl_get_statistics_ack_t { + UInt32 dl_primitive; /* DL_GET_STATISTICS_ACK */ + UInt32 dl_stat_length; /* length of statistics structure*/ + UInt32 dl_stat_offset; /* offset from beg. of block */ +}; +typedef struct dl_get_statistics_ack_t dl_get_statistics_ack_t; +/* CONNECTION-ORIENTED SERVICE PRIMITIVES*/ + +/* DL_CONNECT_REQ, M_PROTO type*/ + +struct dl_connect_req_t { + UInt32 dl_primitive; /* DL_CONNECT_REQ */ + UInt32 dl_dest_addr_length; /* len. of dlsap addr*/ + UInt32 dl_dest_addr_offset; /* offset */ + UInt32 dl_qos_length; /* len. of QOS parm val*/ + UInt32 dl_qos_offset; /* offset */ + UInt32 dl_growth; /* set to zero */ +}; +typedef struct dl_connect_req_t dl_connect_req_t; +/* DL_CONNECT_IND, M_PROTO type*/ +struct dl_connect_ind_t { + UInt32 dl_primitive; /* DL_CONNECT_IND */ + UInt32 dl_correlation; /* provider's correlation token*/ + UInt32 dl_called_addr_length; /* length of called address */ + UInt32 dl_called_addr_offset; /* offset from beginning of block */ + UInt32 dl_calling_addr_length; /* length of calling address */ + UInt32 dl_calling_addr_offset; /* offset from beginning of block */ + UInt32 dl_qos_length; /* length of qos structure */ + UInt32 dl_qos_offset; /* offset from beginning of block */ + UInt32 dl_growth; /* set to zero */ +}; +typedef struct dl_connect_ind_t dl_connect_ind_t; +/* DL_CONNECT_RES, M_PROTO type*/ +struct dl_connect_res_t { + UInt32 dl_primitive; /* DL_CONNECT_RES */ + UInt32 dl_correlation; /* provider's correlation token */ + UInt32 dl_resp_token; /* token associated with responding stream */ + UInt32 dl_qos_length; /* length of qos structure */ + UInt32 dl_qos_offset; /* offset from beginning of block */ + UInt32 dl_growth; /* set to zero */ +}; +typedef struct dl_connect_res_t dl_connect_res_t; +/* DL_CONNECT_CON, M_PROTO type*/ +struct dl_connect_con_t { + UInt32 dl_primitive; /* DL_CONNECT_CON*/ + UInt32 dl_resp_addr_length; /* length of responder's address */ + UInt32 dl_resp_addr_offset; /* offset from beginning of block*/ + UInt32 dl_qos_length; /* length of qos structure */ + UInt32 dl_qos_offset; /* offset from beginning of block*/ + UInt32 dl_growth; /* set to zero */ +}; +typedef struct dl_connect_con_t dl_connect_con_t; +/* DL_TOKEN_REQ, M_PCPROTO type*/ +struct dl_token_req_t { + UInt32 dl_primitive; /* DL_TOKEN_REQ */ +}; +typedef struct dl_token_req_t dl_token_req_t; +/* DL_TOKEN_ACK, M_PCPROTO type*/ +struct dl_token_ack_t { + UInt32 dl_primitive; /* DL_TOKEN_ACK */ + UInt32 dl_token; /* Connection response token associated with the stream */ +}; +typedef struct dl_token_ack_t dl_token_ack_t; +/* DL_DISCONNECT_REQ, M_PROTO type*/ +struct dl_disconnect_req_t { + UInt32 dl_primitive; /* DL_DISCONNECT_REQ */ + UInt32 dl_reason; /*normal, abnormal, perm. or transient*/ + UInt32 dl_correlation; /* association with connect_ind */ +}; +typedef struct dl_disconnect_req_t dl_disconnect_req_t; +/* DL_DISCONNECT_IND, M_PROTO type*/ +struct dl_disconnect_ind_t { + UInt32 dl_primitive; /* DL_DISCONNECT_IND */ + UInt32 dl_originator; /* USER or PROVIDER */ + UInt32 dl_reason; /* permanent or transient */ + UInt32 dl_correlation; /* association with connect_ind */ +}; +typedef struct dl_disconnect_ind_t dl_disconnect_ind_t; +/* DL_RESET_REQ, M_PROTO type*/ +struct dl_reset_req_t { + UInt32 dl_primitive; /* DL_RESET_REQ */ +}; +typedef struct dl_reset_req_t dl_reset_req_t; +/* DL_RESET_IND, M_PROTO type*/ +struct dl_reset_ind_t { + UInt32 dl_primitive; /* DL_RESET_IND */ + UInt32 dl_originator; /* Provider or User */ + UInt32 dl_reason; /* flow control, link error or resynch*/ +}; +typedef struct dl_reset_ind_t dl_reset_ind_t; +/* DL_RESET_RES, M_PROTO type*/ +struct dl_reset_res_t { + UInt32 dl_primitive; /* DL_RESET_RES */ +}; +typedef struct dl_reset_res_t dl_reset_res_t; +/* DL_RESET_CON, M_PROTO type*/ +struct dl_reset_con_t { + UInt32 dl_primitive; /* DL_RESET_CON */ +}; +typedef struct dl_reset_con_t dl_reset_con_t; +/* CONNECTIONLESS SERVICE PRIMITIVES*/ +/* DL_UNITDATA_REQ, M_PROTO type, with M_DATA block(s)*/ + +struct dl_unitdata_req_t { + UInt32 dl_primitive; /* DL_UNITDATA_REQ */ + UInt32 dl_dest_addr_length; /* DLSAP length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ + dl_priority_t dl_priority; /* priority value */ +}; +typedef struct dl_unitdata_req_t dl_unitdata_req_t; +/* DL_UNITDATA_IND, M_PROTO type, with M_DATA block(s)*/ +struct dl_unitdata_ind_t { + UInt32 dl_primitive; /* DL_UNITDATA_IND */ + UInt32 dl_dest_addr_length; /* DLSAP length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ + UInt32 dl_src_addr_length; /* DLSAP addr length of sending user*/ + UInt32 dl_src_addr_offset; /* offset from beg. of block */ + UInt32 dl_group_address; /* set to one if multicast/broadcast*/ +}; +typedef struct dl_unitdata_ind_t dl_unitdata_ind_t; +/* + DL_UDERROR_IND, M_PROTO type + (or M_PCPROTO type if LLI-based provider) +*/ +struct dl_uderror_ind_t { + UInt32 dl_primitive; /* DL_UDERROR_IND */ + UInt32 dl_dest_addr_length; /* Destination DLSAP */ + UInt32 dl_dest_addr_offset; /* Offset from beg. of block */ + UInt32 dl_unix_errno; /* unix system error code*/ + UInt32 dl_errno; /* DLPI error code */ +}; +typedef struct dl_uderror_ind_t dl_uderror_ind_t; +/* DL_UDQOS_REQ, M_PROTO type*/ +struct dl_udqos_req_t { + UInt32 dl_primitive; /* DL_UDQOS_REQ */ + UInt32 dl_qos_length; /* length in bytes of requested qos*/ + UInt32 dl_qos_offset; /* offset from beg. of block */ +}; +typedef struct dl_udqos_req_t dl_udqos_req_t; +/* Primitives to handle XID and TEST operations*/ +/* DL_TEST_REQ, M_PROTO type*/ + +struct dl_test_req_t { + UInt32 dl_primitive; /* DL_TEST_REQ */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* DLSAP length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_test_req_t dl_test_req_t; +/* DL_TEST_IND, M_PROTO type*/ +struct dl_test_ind_t { + UInt32 dl_primitive; /* DL_TEST_IND */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* dlsap length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ + UInt32 dl_src_addr_length; /* dlsap length of source user */ + UInt32 dl_src_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_test_ind_t dl_test_ind_t; +/* DL_TEST_RES, M_PROTO type*/ +struct dl_test_res_t { + UInt32 dl_primitive; /* DL_TEST_RES */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* DLSAP length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_test_res_t dl_test_res_t; +/* DL_TEST_CON, M_PROTO type*/ +struct dl_test_con_t { + UInt32 dl_primitive; /* DL_TEST_CON */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* dlsap length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ + UInt32 dl_src_addr_length; /* dlsap length of source user */ + UInt32 dl_src_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_test_con_t dl_test_con_t; +/* DL_XID_REQ, M_PROTO type*/ +struct dl_xid_req_t { + UInt32 dl_primitive; /* DL_XID_REQ */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* dlsap length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_xid_req_t dl_xid_req_t; +/* DL_XID_IND, M_PROTO type*/ +struct dl_xid_ind_t { + UInt32 dl_primitive; /* DL_XID_IND */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* dlsap length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ + UInt32 dl_src_addr_length; /* dlsap length of source user */ + UInt32 dl_src_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_xid_ind_t dl_xid_ind_t; +/* DL_XID_RES, M_PROTO type*/ +struct dl_xid_res_t { + UInt32 dl_primitive; /* DL_XID_RES */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* DLSAP length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_xid_res_t dl_xid_res_t; +/* DL_XID_CON, M_PROTO type*/ +struct dl_xid_con_t { + UInt32 dl_primitive; /* DL_XID_CON */ + UInt32 dl_flag; /* poll/final */ + UInt32 dl_dest_addr_length; /* dlsap length of dest. user */ + UInt32 dl_dest_addr_offset; /* offset from beg. of block */ + UInt32 dl_src_addr_length; /* dlsap length of source user */ + UInt32 dl_src_addr_offset; /* offset from beg. of block */ +}; +typedef struct dl_xid_con_t dl_xid_con_t; +/* ACKNOWLEDGED CONNECTIONLESS SERVICE PRIMITIVES*/ + +/* DL_DATA_ACK_REQ, M_PROTO type*/ + +struct dl_data_ack_req_t { + UInt32 dl_primitive; /* DL_DATA_ACK_REQ */ + UInt32 dl_correlation; /* User's correlation token */ + UInt32 dl_dest_addr_length; /* length of destination addr */ + UInt32 dl_dest_addr_offset; /* offset from beginning of block */ + UInt32 dl_src_addr_length; /* length of source address */ + UInt32 dl_src_addr_offset; /* offset from beginning of block */ + UInt32 dl_priority; /* priority */ + UInt32 dl_service_class; /* DL_RQST_RSP or DL_RQST_NORSP */ +}; +typedef struct dl_data_ack_req_t dl_data_ack_req_t; +/* DL_DATA_ACK_IND, M_PROTO type*/ +struct dl_data_ack_ind_t { + UInt32 dl_primitive; /* DL_DATA_ACK_IND */ + UInt32 dl_dest_addr_length; /* length of destination addr */ + UInt32 dl_dest_addr_offset; /* offset from beginning of block */ + UInt32 dl_src_addr_length; /* length of source address */ + UInt32 dl_src_addr_offset; /* offset from beginning of block */ + UInt32 dl_priority; /* priority for data unit transm. */ + UInt32 dl_service_class; /* DL_RQST_RSP or DL_RQST_NORSP */ +}; +typedef struct dl_data_ack_ind_t dl_data_ack_ind_t; +/* DL_DATA_ACK_STATUS_IND, M_PROTO type*/ +struct dl_data_ack_status_ind_t { + UInt32 dl_primitive; /* DL_DATA_ACK_STATUS_IND */ + UInt32 dl_correlation; /* User's correlation token */ + UInt32 dl_status; /* success or failure of previous req*/ +}; +typedef struct dl_data_ack_status_ind_t dl_data_ack_status_ind_t; +/* DL_REPLY_REQ, M_PROTO type*/ +struct dl_reply_req_t { + UInt32 dl_primitive; /* DL_REPLY_REQ */ + UInt32 dl_correlation; /* User's correlation token */ + UInt32 dl_dest_addr_length; /* length of destination address */ + UInt32 dl_dest_addr_offset; /* offset from beginning of block */ + UInt32 dl_src_addr_length; /* source address length */ + UInt32 dl_src_addr_offset; /* offset from beginning of block */ + UInt32 dl_priority; /* priority for data unit transmission*/ + UInt32 dl_service_class; +}; +typedef struct dl_reply_req_t dl_reply_req_t; +/* DL_REPLY_IND, M_PROTO type*/ +struct dl_reply_ind_t { + UInt32 dl_primitive; /* DL_REPLY_IND */ + UInt32 dl_dest_addr_length; /* length of destination address */ + UInt32 dl_dest_addr_offset; /* offset from beginning of block*/ + UInt32 dl_src_addr_length; /* length of source address */ + UInt32 dl_src_addr_offset; /* offset from beginning of block */ + UInt32 dl_priority; /* priority for data unit transmission*/ + UInt32 dl_service_class; /* DL_RQST_RSP or DL_RQST_NORSP */ +}; +typedef struct dl_reply_ind_t dl_reply_ind_t; +/* DL_REPLY_STATUS_IND, M_PROTO type*/ +struct dl_reply_status_ind_t { + UInt32 dl_primitive; /* DL_REPLY_STATUS_IND */ + UInt32 dl_correlation; /* User's correlation token */ + UInt32 dl_status; /* success or failure of previous req*/ +}; +typedef struct dl_reply_status_ind_t dl_reply_status_ind_t; +/* DL_REPLY_UPDATE_REQ, M_PROTO type*/ +struct dl_reply_update_req_t { + UInt32 dl_primitive; /* DL_REPLY_UPDATE_REQ */ + UInt32 dl_correlation; /* user's correlation token */ + UInt32 dl_src_addr_length; /* length of source address */ + UInt32 dl_src_addr_offset; /* offset from beginning of block */ +}; +typedef struct dl_reply_update_req_t dl_reply_update_req_t; +/* DL_REPLY_UPDATE_STATUS_IND, M_PROTO type*/ +struct dl_reply_update_status_ind_t { + UInt32 dl_primitive; /* DL_REPLY_UPDATE_STATUS_IND */ + UInt32 dl_correlation; /* User's correlation token */ + UInt32 dl_status; /* success or failure of previous req*/ +}; +typedef struct dl_reply_update_status_ind_t dl_reply_update_status_ind_t; +union DL_primitives { + UInt32 dl_primitive; + dl_info_req_t info_req; + dl_info_ack_t info_ack; + dl_attach_req_t attach_req; + dl_detach_req_t detach_req; + dl_bind_req_t bind_req; + dl_bind_ack_t bind_ack; + dl_unbind_req_t unbind_req; + dl_subs_bind_req_t subs_bind_req; + dl_subs_bind_ack_t subs_bind_ack; + dl_subs_unbind_req_t subs_unbind_req; + dl_ok_ack_t ok_ack; + dl_error_ack_t error_ack; + dl_connect_req_t connect_req; + dl_connect_ind_t connect_ind; + dl_connect_res_t connect_res; + dl_connect_con_t connect_con; + dl_token_req_t token_req; + dl_token_ack_t token_ack; + dl_disconnect_req_t disconnect_req; + dl_disconnect_ind_t disconnect_ind; + dl_reset_req_t reset_req; + dl_reset_ind_t reset_ind; + dl_reset_res_t reset_res; + dl_reset_con_t reset_con; + dl_unitdata_req_t unitdata_req; + dl_unitdata_ind_t unitdata_ind; + dl_uderror_ind_t uderror_ind; + dl_udqos_req_t udqos_req; + dl_enabmulti_req_t enabmulti_req; + dl_disabmulti_req_t disabmulti_req; + dl_promiscon_req_t promiscon_req; + dl_promiscoff_req_t promiscoff_req; + dl_phys_addr_req_t physaddr_req; + dl_phys_addr_ack_t physaddr_ack; + dl_set_phys_addr_req_t set_physaddr_req; + dl_get_statistics_req_t get_statistics_req; + dl_get_statistics_ack_t get_statistics_ack; + dl_test_req_t test_req; + dl_test_ind_t test_ind; + dl_test_res_t test_res; + dl_test_con_t test_con; + dl_xid_req_t xid_req; + dl_xid_ind_t xid_ind; + dl_xid_res_t xid_res; + dl_xid_con_t xid_con; + dl_data_ack_req_t data_ack_req; + dl_data_ack_ind_t data_ack_ind; + dl_data_ack_status_ind_t data_ack_status_ind; + dl_reply_req_t reply_req; + dl_reply_ind_t reply_ind; + dl_reply_status_ind_t reply_status_ind; + dl_reply_update_req_t reply_update_req; + dl_reply_update_status_ind_t reply_update_status_ind; +}; +typedef union DL_primitives DL_primitives; +enum { + DL_INFO_REQ_SIZE = sizeof(dl_info_req_t), + DL_INFO_ACK_SIZE = sizeof(dl_info_ack_t), + DL_ATTACH_REQ_SIZE = sizeof(dl_attach_req_t), + DL_DETACH_REQ_SIZE = sizeof(dl_detach_req_t), + DL_BIND_REQ_SIZE = sizeof(dl_bind_req_t), + DL_BIND_ACK_SIZE = sizeof(dl_bind_ack_t), + DL_UNBIND_REQ_SIZE = sizeof(dl_unbind_req_t), + DL_SUBS_BIND_REQ_SIZE = sizeof(dl_subs_bind_req_t), + DL_SUBS_BIND_ACK_SIZE = sizeof(dl_subs_bind_ack_t), + DL_SUBS_UNBIND_REQ_SIZE = sizeof(dl_subs_unbind_req_t), + DL_OK_ACK_SIZE = sizeof(dl_ok_ack_t), + DL_ERROR_ACK_SIZE = sizeof(dl_error_ack_t), + DL_CONNECT_REQ_SIZE = sizeof(dl_connect_req_t), + DL_CONNECT_IND_SIZE = sizeof(dl_connect_ind_t), + DL_CONNECT_RES_SIZE = sizeof(dl_connect_res_t), + DL_CONNECT_CON_SIZE = sizeof(dl_connect_con_t), + DL_TOKEN_REQ_SIZE = sizeof(dl_token_req_t), + DL_TOKEN_ACK_SIZE = sizeof(dl_token_ack_t), + DL_DISCONNECT_REQ_SIZE = sizeof(dl_disconnect_req_t), + DL_DISCONNECT_IND_SIZE = sizeof(dl_disconnect_ind_t), + DL_RESET_REQ_SIZE = sizeof(dl_reset_req_t), + DL_RESET_IND_SIZE = sizeof(dl_reset_ind_t), + DL_RESET_RES_SIZE = sizeof(dl_reset_res_t), + DL_RESET_CON_SIZE = sizeof(dl_reset_con_t), + DL_UNITDATA_REQ_SIZE = sizeof(dl_unitdata_req_t), + DL_UNITDATA_IND_SIZE = sizeof(dl_unitdata_ind_t), + DL_UDERROR_IND_SIZE = sizeof(dl_uderror_ind_t), + DL_UDQOS_REQ_SIZE = sizeof(dl_udqos_req_t), + DL_ENABMULTI_REQ_SIZE = sizeof(dl_enabmulti_req_t), + DL_DISABMULTI_REQ_SIZE = sizeof(dl_disabmulti_req_t), + DL_PROMISCON_REQ_SIZE = sizeof(dl_promiscon_req_t), + DL_PROMISCOFF_REQ_SIZE = sizeof(dl_promiscoff_req_t), + DL_PHYS_ADDR_REQ_SIZE = sizeof(dl_phys_addr_req_t), + DL_PHYS_ADDR_ACK_SIZE = sizeof(dl_phys_addr_ack_t), + DL_SET_PHYS_ADDR_REQ_SIZE = sizeof(dl_set_phys_addr_req_t), + DL_GET_STATISTICS_REQ_SIZE = sizeof(dl_get_statistics_req_t), + DL_GET_STATISTICS_ACK_SIZE = sizeof(dl_get_statistics_ack_t), + DL_XID_REQ_SIZE = sizeof(dl_xid_req_t), + DL_XID_IND_SIZE = sizeof(dl_xid_ind_t), + DL_XID_RES_SIZE = sizeof(dl_xid_res_t), + DL_XID_CON_SIZE = sizeof(dl_xid_con_t), + DL_TEST_REQ_SIZE = sizeof(dl_test_req_t), + DL_TEST_IND_SIZE = sizeof(dl_test_ind_t), + DL_TEST_RES_SIZE = sizeof(dl_test_res_t), + DL_TEST_CON_SIZE = sizeof(dl_test_con_t), + DL_DATA_ACK_REQ_SIZE = sizeof(dl_data_ack_req_t), + DL_DATA_ACK_IND_SIZE = sizeof(dl_data_ack_ind_t), + DL_DATA_ACK_STATUS_IND_SIZE = sizeof(dl_data_ack_status_ind_t), + DL_REPLY_REQ_SIZE = sizeof(dl_reply_req_t), + DL_REPLY_IND_SIZE = sizeof(dl_reply_ind_t), + DL_REPLY_STATUS_IND_SIZE = sizeof(dl_reply_status_ind_t), + DL_REPLY_UPDATE_REQ_SIZE = sizeof(dl_reply_update_req_t), + DL_REPLY_UPDATE_STATUS_IND_SIZE = sizeof(dl_reply_update_status_ind_t) +}; + +enum { + DL_IOC_HDR_INFO = ((MIOC_DLPI << 8) | 10) /* Fast path request */ +}; + +/* ***** From the Mentat "modnames.h" ******/ + + +#define MI_AFU_NAME "afu" +#define MI_AHARP_NAME "ahar" +#define MI_AHENET_NAME "ahen" +#define MI_ARP_NAME "arp" +#define MI_ARPM_NAME "arpm" +#define MI_COURMUX_NAME "courmux" +#define MI_CLONE_NAME "clone" +#define MI_DLB_NAME "dlb" +#define MI_DLM_NAME "dlm" +#define MI_DMODD_NAME "disdlpi" +#define MI_DMODT_NAME "distpi" +#define MI_DN_NAME "dn" +#define MI_DNF_NAME "dnf" +#define MI_DRVE_NAME "drve" +#define MI_ECHO_NAME "echo" +#define MI_ENXR_NAME "enxr" +#define MI_RAWIP_NAME "rawip" +#define MI_RAWIPM_NAME "rawipm" +#define MI_HAVOC_NAME "havoc" +#define MI_HAVOCM_NAME "havocm" +#define MI_IP_NAME "ip" +#define MI_IPM_NAME "ipm" +#define MI_IPX_NAME "ipx" +#define MI_LOG_NAME "log" +#define MI_MODE_NAME "mode" +#define MI_MUX_NAME "mux" +#define MI_NECHO_NAME "necho" +#define MI_NPEP_NAME "npep" +#define MI_NULS_NAME "nuls" +#define MI_NULZ_NAME "nulz" +#define MI_PASS_NAME "pass" +#define MI_PIPEMOD_NAME "pipemod" +#define MI_SAD_NAME "sad" +#define MI_SC_NAME "sc" +#define MI_SOCKMOD_NAME "sockmod" +#define MI_SPASS_NAME "spass" +#define MI_SPX_NAME "spx" +#define MI_STH_NAME "mi_sth" +#define MI_TCP_NAME "tcp" +#define MI_TCPM_NAME "tcpm" +#define MI_TIMOD_NAME "timod" +#define MI_TIRDWR_NAME "tirdwr" +#define MI_TMOD_NAME "tmod" +#define MI_TMUX_NAME "tmux" +#define MI_TPIT_NAME "tpit" +#define MI_TRSR_NAME "trsr" +#define MI_TRXR_NAME "trxr" +#define MI_UDP_NAME "udp" +#define MI_UDPM_NAME "udpm" +#define MI_WELD_NAME "mi_weld" +#define MI_XDG_NAME "xdg" +#define MI_XECHO_NAME "xecho" +#define MI_XF_NAME "xf" +#define MI_XFIPX_NAME "xfipx" +#define MI_XFXNS_NAME "xfxns" +#define MI_XPE_NAME "xpe" +#define MI_XS_NAME "xs" +#define MI_XTINDG_NAME "xtindg" +#define MI_XTINVC_NAME "xtinvc" +#define MI_XTM_NAME "xtm" +#define MI_XTMIP_NAME "xtmip" + +#define MI_AFU_DEVICE "/dev/afu" +#define MI_ARP_DEVICE "/dev/arp" +#define MI_COURMUX_DEVICE "/dev/courmux" +#define MI_CLONE_DEVICE "/dev/clone" +#define MI_DLB_DEVICE "/dev/dlb" +#define MI_DN_DEVICE "/dev/dn" +#define MI_DNF_DEVICE "/dev/dnf" +#define MI_DRVE_DEVICE "/dev/drve" +#define MI_ECHO_DEVICE "/dev/echo" +#define MI_RAWIP_DEVICE "/dev/rawip" +#define MI_HAVOC_DEVICE "/dev/havoc" +#define MI_IP_DEVICE "/dev/ip" +#define MI_IPX_DEVICE "/dev/ipx" +#define MI_LOG_DEVICE "/dev/log" +#define MI_MODE_DEVICE "/dev/mode" +#define MI_MUX_DEVICE "/dev/mux" +#define MI_NECHO_DEVICE "/dev/necho" +#define MI_NPEP_DEVICE "/dev/npep" +#define MI_NULS_DEVICE "/dev/nuls" +#define MI_NULZ_DEVICE "/dev/nulz" +#define MI_SAD_DEVICE "/dev/sad" +#define MI_SPX_DEVICE "/dev/spx" +#define MI_TCP_DEVICE "/dev/tcp" +#define MI_TMUX_DEVICE "/dev/tmux" +#define MI_TMUX0_DEVICE "/dev/tmux#0" +#define MI_TMUX1_DEVICE "/dev/tmux#1" +#define MI_TPIT_DEVICE "/dev/tpit" +#define MI_UDP_DEVICE "/dev/udp" +#define MI_XDG_DEVICE "/dev/xdg" +#define MI_XECHO_DEVICE "/dev/xecho" +#define MI_XF_DEVICE "/dev/xf" +#define MI_XPE_DEVICE "/dev/xpe" +#define MI_XS_DEVICE "/dev/xs" +#define MI_XTINDG_DEVICE "/dev/xtindg" +#define MI_XTINVC_DEVICE "/dev/xtinvc" + + +/* Streamtab entries */ +#define MI_AFU_STREAMTAB afuinfo +#define MI_AHARP_STREAMTAB aharinfo +#define MI_AHENET_STREAMTAB aheninfo +#define MI_ARP_STREAMTAB arpinfo +#define MI_ARPM_STREAMTAB arpminfo +#define MI_COURMUX_STREAMTAB courmuxinfo +#define MI_CLONE_STREAMTAB cloneinfo +#define MI_DLB_STREAMTAB dlbinfo +#define MI_DLM_STREAMTAB dlminfo +#define MI_DMODD_STREAMTAB dmoddinfo +#define MI_DMODT_STREAMTAB dmodtinfo +#define MI_DN_STREAMTAB dninfo +#define MI_DNF_STREAMTAB dnfinfo +#define MI_DRVE_STREAMTAB drveinfo +#define MI_ECHO_STREAMTAB echoinfo +#define MI_ENXR_STREAMTAB enxrinfo +#define MI_HAVOC_STREAMTAB hvcinfo +#define MI_HAVOCM_STREAMTAB hvcminfo +#define MI_IP_STREAMTAB ipinfo +#define MI_IPM_STREAMTAB ipminfo +#define MI_IPX_STREAMTAB ipxinfo +#define MI_LOG_STREAMTAB loginfo +#define MI_MODE_STREAMTAB modeinfo +#define MI_MUX_STREAMTAB muxinfo +#define MI_NECHO_STREAMTAB nechoinfo +#define MI_NPEP_STREAMTAB npepinfo +#define MI_NULS_STREAMTAB nulsinfo +#define MI_NULZ_STREAMTAB nulzinfo +#define MI_PASS_STREAMTAB passinfo +#define MI_PIPEMOD_STREAMTAB pmodinfo +#define MI_RAWIP_STREAMTAB rawipinfo +#define MI_RAWIPM_STREAMTAB rawipminfo +#define MI_SAD_STREAMTAB sadinfo +#define MI_SC_STREAMTAB scinfo +#define MI_SOCKMOD_STREAMTAB sockmodinfo +#define MI_SPASS_STREAMTAB spassinfo +#define MI_SPX_STREAMTAB spxinfo +#define MI_STH_STREAMTAB mi_sthinfo +#define MI_TCP_STREAMTAB tcpinfo +#define MI_TCPM_STREAMTAB tcpminfo +#define MI_TIMOD_STREAMTAB timodinfo +#define MI_TIRDWR_STREAMTAB tirdwrinfo +#define MI_TMOD_STREAMTAB tmodinfo +#define MI_TMUX_STREAMTAB tmuxinfo +#define MI_TPIT_STREAMTAB tpitinfo +#define MI_TRSR_STREAMTAB trsrinfo +#define MI_TRXR_STREAMTAB trxrinfo +#define MI_UDP_STREAMTAB udpinfo +#define MI_UDPM_STREAMTAB udpminfo +#define MI_WELD_STREAMTAB mi_weldinfo +#define MI_XDG_STREAMTAB xdginfo +#define MI_XECHO_STREAMTAB xechoinfo +#define MI_XF_STREAMTAB xfinfo +#define MI_XFIPX_STREAMTAB xfipxinfo +#define MI_XFXNS_STREAMTAB xfxnsinfo +#define MI_XPE_STREAMTAB xpeinfo +#define MI_XS_STREAMTAB xsinfo +#define MI_XTINDG_STREAMTAB xtindginfo +#define MI_XTINVC_STREAMTAB xtinvcinfo +#define MI_XTM_STREAMTAB xtminfo +#define MI_XTMIP_STREAMTAB xtmipinfo + + +#define MI_AFU_DEVFLAG afudevflag +#define MI_AHARP_DEVFLAG ahardevflag +#define MI_AHENET_DEVFLAG ahendevflag +#define MI_ARP_DEVFLAG arpdevflag +#define MI_ARPM_DEVFLAG arpmdevflag +#define MI_COURMUX_DEVFLAG courmuxdevflag +#define MI_CLONE_DEVFLAG clonedevflag +#define MI_DLB_DEVFLAG dlbdevflag +#define MI_DLM_DEVFLAG dlmdevflag +#define MI_DMODD_DEVFLAG dmodddevflag +#define MI_DMODT_DEVFLAG dmodtdevflag +#define MI_DN_DEVFLAG dndevflag +#define MI_DNF_DEVFLAG dnfdevflag +#define MI_DRVE_DEVFLAG drvedevflag +#define MI_ECHO_DEVFLAG echodevflag +#define MI_ENXR_DEVFLAG enxrdevflag +#define MI_HAVOC_DEVFLAG hvcdevflag +#define MI_HAVOCM_DEVFLAG hvcmdevflag +#define MI_IP_DEVFLAG ipdevflag +#define MI_IPM_DEVFLAG ipmdevflag +#define MI_IPX_DEVFLAG ipxdevflag +#define MI_LOG_DEVFLAG logdevflag +#define MI_MODE_DEVFLAG modedevflag +#define MI_MUX_DEVFLAG muxdevflag +#define MI_NECHO_DEVFLAG nechodevflag +#define MI_NPEP_DEVFLAG npepdevflag +#define MI_NULS_DEVFLAG nulsdevflag +#define MI_NULZ_DEVFLAG nulzdevflag +#define MI_PASS_DEVFLAG passdevflag +#define MI_PIPEMOD_DEVFLAG pipemoddevflag +#define MI_RAWIP_DEVFLAG rawipdevflag +#define MI_RAWIPM_DEVFLAG rawipmdevflag + +#define MI_SAD_DEVFLAG saddevflag +#define MI_SC_DEVFLAG scdevflag +#define MI_SOCKMOD_DEVFLAG sockmoddevflag +#define MI_SPASS_DEVFLAG spassdevflag +#define MI_SPX_DEVFLAG spxdevflag +#define MI_TCP_DEVFLAG tcpdevflag +#define MI_TCPM_DEVFLAG tcpmdevflag +#define MI_TIMOD_DEVFLAG timoddevflag +#define MI_TIRDWR_DEVFLAG tirdwrdevflag +#define MI_TMOD_DEVFLAG tmoddevflag +#define MI_TMUX_DEVFLAG tmuxdevflag +#define MI_TPIT_DEVFLAG tpitdevflag +#define MI_TRSR_DEVFLAG trsrdevflag +#define MI_TRXR_DEVFLAG trxrdevflag +#define MI_UDP_DEVFLAG udpdevflag +#define MI_UDPM_DEVFLAG udpmdevflag +#define MI_XDG_DEVFLAG xdgdevflag +#define MI_XECHO_DEVFLAG xechodevflag +#define MI_XF_DEVFLAG xfdevflag +#define MI_XFIPX_DEVFLAG xfipxdevflag +#define MI_XFXNS_DEVFLAG xfxnsdevflag +#define MI_XPE_DEVFLAG xpedevflag +#define MI_XS_DEVFLAG xsdevflag +#define MI_XTINDG_DEVFLAG xtindgdevflag +#define MI_XTINVC_DEVFLAG xtinvcdevflag +#define MI_XTM_DEVFLAG xtmdevflag +#define MI_XTMIP_DEVFLAG xtmipdevflag + +#define MI_AFU_SQLVL SQLVL_QUEUEPAIR +#define MI_AHARP_SQLVL SQLVL_QUEUE +#define MI_AHENET_SQLVL SQLVL_QUEUE +#define MI_ARP_SQLVL SQLVL_MODULE +#define MI_ARPM_SQLVL SQLVL_MODULE +#define MI_COURMUX_SQLVL SQLVL_MODULE +#define MI_CLONE_SQLVL SQLVL_MODULE +#define MI_DLB_SQLVL SQLVL_QUEUE +#define MI_DLM_SQLVL SQLVL_QUEUE +#define MI_DMODD_SQLVL SQLVL_QUEUE +#define MI_DMODT_SQLVL SQLVL_QUEUE +#define MI_DN_SQLVL SQLVL_QUEUE +#define MI_DNF_SQLVL SQLVL_QUEUE +#define MI_DRVE_SQLVL SQLVL_QUEUEPAIR +#define MI_ECHO_SQLVL SQLVL_QUEUE +#define MI_ENXR_SQLVL SQLVL_QUEUE +#define MI_RAWIP_SQLVL SQLVL_QUEUE +#define MI_RAWIPM_SQLVL SQLVL_QUEUE +#define MI_HAVOC_SQLVL SQLVL_QUEUE +#define MI_HAVOCM_SQLVL SQLVL_QUEUE +#define MI_IP_SQLVL SQLVL_QUEUEPAIR +#define MI_IPM_SQLVL SQLVL_QUEUEPAIR +#define MI_IPX_SQLVL SQLVL_QUEUE +#define MI_LOG_SQLVL SQLVL_MODULE +#define MI_MODE_SQLVL SQLVL_QUEUEPAIR +#define MI_MUX_SQLVL SQLVL_MODULE +#define MI_NECHO_SQLVL SQLVL_QUEUE + +#define MI_NPEP_SQLVL SQLVL_QUEUE +#define MI_NULS_SQLVL SQLVL_QUEUE +#define MI_NULZ_SQLVL SQLVL_QUEUE +#define MI_PASS_SQLVL SQLVL_QUEUE +#define MI_PIPEMOD_SQLVL SQLVL_QUEUE + +#define MI_SAD_SQLVL SQLVL_MODULE +#define MI_SC_SQLVL SQLVL_QUEUE +#define MI_SOCKMOD_SQLVL SQLVL_QUEUEPAIR +#define MI_SPASS_SQLVL SQLVL_QUEUE +#define MI_SPX_SQLVL SQLVL_QUEUE +#define MI_TCP_SQLVL SQLVL_QUEUEPAIR +#define MI_TCPM_SQLVL SQLVL_QUEUEPAIR +#define MI_TIMOD_SQLVL SQLVL_QUEUEPAIR +#define MI_TIRDWR_SQLVL SQLVL_QUEUE +#define MI_TMOD_SQLVL SQLVL_QUEUEPAIR +#define MI_TMUX_SQLVL SQLVL_MODULE +#define MI_TPIT_SQLVL SQLVL_MODULE +#define MI_TRSR_SQLVL SQLVL_MODULE +#define MI_TRXR_SQLVL SQLVL_QUEUE +#define MI_UDP_SQLVL SQLVL_QUEUE +#define MI_UDPM_SQLVL SQLVL_QUEUE +#define MI_XDG_SQLVL SQLVL_QUEUE +#define MI_XECHO_SQLVL SQLVL_QUEUE +#define MI_XF_SQLVL SQLVL_MODULE +#define MI_XFIPX_SQLVL SQLVL_MODULE +#define MI_XFXNS_SQLVL SQLVL_MODULE +#define MI_XPE_SQLVL SQLVL_QUEUE +#define MI_XS_SQLVL SQLVL_QUEUEPAIR +#define MI_XTINDG_SQLVL SQLVL_QUEUEPAIR +#define MI_XTINVC_SQLVL SQLVL_QUEUEPAIR +#define MI_XTM_SQLVL SQLVL_QUEUEPAIR +#define MI_XTMIP_SQLVL SQLVL_QUEUEPAIR +/* ***** Raw Streams ******/ + + +/* + Flags used in the fType field of OTReadInfo for functions. + I've removed the terse and confusing comments in this header + file. For a full description, read "Open Transport Advanced + Client Programming". +*/ + +enum { + kOTNoMessagesAvailable = (unsigned long)0xFFFFFFFF, + kOTAnyMsgType = (unsigned long)0xFFFFFFFE, + kOTDataMsgTypes = (unsigned long)0xFFFFFFFC, + kOTMProtoMsgTypes = (unsigned long)0xFFFFFFFB, + kOTOnlyMProtoMsgTypes = (unsigned long)0xFFFFFFFA +}; + +#if !OTKERNEL +/* StreamRef is an opaque reference to a raw stream.*/ + +typedef struct OpaqueStreamRef* StreamRef; +#define kOTInvalidStreamRef ((StreamRef)0L) +/* PollRef structure is used with the OTStreamPoll function.*/ +struct PollRef { + SInt32 filler; /* holds a file descriptor an a UNIX system, replaced by ref (at end of structure) under OT*/ + SInt16 events; + SInt16 revents; + StreamRef ref; +}; +typedef struct PollRef PollRef; + +/* Poll masks for use with OTStreamPoll: */ + +#define POLLIN 0x001 /* A non-priority message is available */ +#define POLLPRI 0x002 /* A high priority message is available */ +#define POLLOUT 0x004 /* The stream is writable for non-priority messages */ +#define POLLERR 0x008 /* A error message has arrived */ +#define POLLHUP 0x010 /* A hangup has occurred */ +#define POLLNVAL 0x020 /* This fd is bogus */ +#define POLLRDNORM 0x040 /* A non-priority message is available */ +#define POLLRDBAND 0x080 /* A priority message (band > 0) message is available */ +#define POLLWRNORM 0x100 /* Same as POLLOUT */ +#define POLLWRBAND 0x200 /* A priority band exists and is writable */ +#define POLLMSG 0x400 /* A signal message has reached the front of the queue */ + +/* OTReadInfo structure is used with the various functions that read and peek at the stream head.*/ + +struct OTReadInfo { + UInt32 fType; + OTCommand fCommand; + UInt32 fFiller; /* For compatibility with OT 1.0 and 1.1 */ + ByteCount fBytes; + OSStatus fError; +}; +typedef struct OTReadInfo OTReadInfo; +/* Opening and closing raw streams*/ +#if CALL_NOT_IN_CARBON +/* + * OTStreamOpen() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( StreamRef ) +OTStreamOpen( + const char * name, + OTOpenFlags oFlags, + OSStatus * errPtr); + + +/* + * OTAsyncStreamOpen() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTAsyncStreamOpen( + const char * name, + OTOpenFlags oFlags, + OTNotifyUPP proc, + void * contextPtr); + + +/* + * OTCreateStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( StreamRef ) +OTCreateStream( + OTConfigurationRef cfig, + OTOpenFlags oFlags, + OSStatus * errPtr); + + +/* + * OTAsyncCreateStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTAsyncCreateStream( + OTConfigurationRef cfig, + OTOpenFlags oFlags, + OTNotifyUPP proc, + void * contextPtr); + + +/* + * OTStreamClose() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTStreamClose(StreamRef strm); + + +/* Polling a stream for activity*/ + +/* + * OTStreamPoll() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamPoll( + PollRef * fds, + UInt32 nfds, + OTTimeout timeout); + + +/* + * OTAsyncStreamPoll() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTAsyncStreamPoll( + PollRef * fds, + UInt32 nfds, + OTTimeout timeout, + OTNotifyUPP proc, + void * contextPtr); + + +/* Classic UNIX file descriptor operations*/ + +/* + * OTStreamRead() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamRead( + StreamRef strm, + void * buf, + OTByteCount len); + + +/* + * OTStreamWrite() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamWrite( + StreamRef strm, + void * buf, + OTByteCount len); + + +/* + * OTStreamIoctl() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamIoctl( + StreamRef strm, + UInt32 cmd, + void * data); + + +/* + * OTStreamPipe() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamPipe(StreamRef streamsToPipe[]); + + +/* there can be only 2!*/ +/* Notifiers and modes of operation*/ +/* + * OTStreamInstallNotifier() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTStreamInstallNotifier( + StreamRef strm, + OTNotifyUPP proc, + void * contextPtr); + + +/* + * OTStreamRemoveNotifier() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTStreamRemoveNotifier(StreamRef strm); + + +/* + * OTStreamUseSyncIdleEvents() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTStreamUseSyncIdleEvents( + StreamRef strm, + Boolean useEvents); + + +/* + * OTStreamSetBlocking() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTStreamSetBlocking(StreamRef strm); + + +/* + * OTStreamSetNonBlocking() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTStreamSetNonBlocking(StreamRef strm); + + +/* + * OTStreamIsBlocking() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( Boolean ) +OTStreamIsBlocking(StreamRef strm); + + +/* + * OTStreamSetSynchronous() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTStreamSetSynchronous(StreamRef strm); + + +/* + * OTStreamSetAsynchronous() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTStreamSetAsynchronous(StreamRef strm); + + +/* + * OTStreamIsSynchronous() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( Boolean ) +OTStreamIsSynchronous(StreamRef strm); + + +/* STREAMS primitives*/ + +/* + * OTStreamGetMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamGetMessage( + StreamRef strm, + strbuf * ctlbuf, + strbuf * databuf, + OTFlags * flags); + + +/* + * OTStreamGetPriorityMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTResult ) +OTStreamGetPriorityMessage( + StreamRef strm, + strbuf * ctlbuf, + strbuf * databuf, + OTBand * band, + OTFlags * flags); + + +/* + * OTStreamPutMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTStreamPutMessage( + StreamRef strm, + const strbuf * ctlbuf, + const strbuf * databuf, + OTFlags flags); + + +/* + * OTStreamPutPriorityMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTStreamPutPriorityMessage( + StreamRef strm, + const strbuf * ctlbuf, + const strbuf * databuf, + OTBand band, + OTFlags flags); + + +/* Miscellaneous stuff*/ + +/* + * OTStreamSetControlMask() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTStreamSetControlMask( + StreamRef strm, + UInt32 mask, + Boolean setClear); + + +/* + Opening endpoints and mappers on a Stream - these calls are synchronous, and may + only be used at System Task time. Once the stream has been installed into a provider + or endpoint, you should not continue to use STREAMS APIs on it +*/ + +/* + * OTOpenProviderOnStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( ProviderRef ) +OTOpenProviderOnStream( + StreamRef strm, + OSStatus * errPtr); + + +/* + * OTOpenEndpointOnStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( EndpointRef ) +OTOpenEndpointOnStream( + StreamRef strm, + OSStatus * errPtr); + + +/* + To quote an earlier version of this header file: + + Some functions that should only be used if + you really know what you're doing. +*/ + +/* + * OTRemoveStreamFromProvider() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( StreamRef ) +OTRemoveStreamFromProvider(ProviderRef ref); + + +/* + * OTPeekMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OSStatus ) +OTPeekMessage( + StreamRef strm, + OTReadInfo * readInfo); + + +/* + * OTReadMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTBuffer * ) +OTReadMessage( + StreamRef strm, + OTReadInfo * readInfo); + + +/* + * OTPutBackBuffer() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTPutBackBuffer( + StreamRef strm, + OTBuffer * buffer); + + +/* + * OTPutBackPartialBuffer() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( void ) +OTPutBackPartialBuffer( + StreamRef strm, + OTBufferInfo * readInfo, + OTBuffer * buffer); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +#endif /* CALL_NOT_IN_CARBON */ + +/* ***** Port Utilities ******/ +#if !OTKERNEL +/* + These types and routines are used during sophisticated + port management. High-level clients may get involved + for things like request a port to be yielding, but typically + this stuff is used by protocol infrastructure. +*/ +/* + OTPortCloseStruct is used when processing the kOTClosePortRequest + and kOTYieldPortRequest events. +*/ + +struct OTPortCloseStruct { + OTPortRef fPortRef; /* The port requested to be closed.*/ + ProviderRef fTheProvider; /* The provider using the port.*/ + OSStatus fDenyReason; /* Set to a negative number to deny the request*/ +}; +typedef struct OTPortCloseStruct OTPortCloseStruct; +/* OTClientList structure is used with the OTYieldPortRequest function.*/ +struct OTClientList { + ItemCount fNumClients; + UInt8 fBuffer[4]; +}; +typedef struct OTClientList OTClientList; +/* + Returns a buffer containing all of the clients that refused to yield the port. + "size" is the total number of bytes @ buffer, including the fNumClients field. +*/ +#if CALL_NOT_IN_CARBON +/* + * OTYieldPortRequest() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTYieldPortRequest( + ProviderRef ref, + OTPortRef portRef, + OTClientList * buffer, + OTByteCount size); + + +/* Send a notification to all Open Transport registered clients*/ +/* + * OTNotifyAllClients() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTNotifyAllClients( + OTEventCode code, + OTResult result, + void * cookie); + + +/* Determine if "child" is a child port of "parent"*/ +/* + * OTIsDependentPort() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTIsDependentPort( + OTPortRef parent, + OTPortRef child); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +/* ***** Timers ***** */ +/* + STREAMS plug-ins code should not use these timers, instead + they should use timer messages, ie mi_timer etc. +*/ + +#if !OTKERNEL + +typedef long OTTimerTask; +/* + Under Carbon, OTCreateTimerTask takes a client context pointer. Applications may pass NULL + after calling InitOpenTransport(kInitOTForApplicationMask, ...). Non-applications must always pass a + valid client context. +*/ +/* + * OTCreateTimerTaskInContext() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( long ) +OTCreateTimerTaskInContext( + OTProcessUPP upp, + void * arg, + OTClientContextPtr clientContext); + + +#if CALL_NOT_IN_CARBON +/* + * OTCreateTimerTask() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API( OTTimerTask ) +OTCreateTimerTask( + OTProcessUPP proc, + void * arg); + + +#endif /* CALL_NOT_IN_CARBON */ + +/* + * OTCancelTimerTask() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( Boolean ) +OTCancelTimerTask(OTTimerTask timerTask); + + +/* + * OTDestroyTimerTask() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( void ) +OTDestroyTimerTask(OTTimerTask timerTask); + + +/* + * OTScheduleTimerTask() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API( Boolean ) +OTScheduleTimerTask( + OTTimerTask timerTask, + OTTimeout milliSeconds); + + +#if OTCARBONAPPLICATION +/* The following macro may be used by applications only.*/ +#define OTCreateTimerTask(upp, arg) OTCreateTimerTaskInContext(upp, arg, NULL) +#endif /* OTCARBONAPPLICATION */ + +#endif /* !OTKERNEL */ + +/* ***** Miscellaneous Helpful Functions ******/ + +#if !OTKERNEL +/* + These routines allow you to manipulate OT's buffer structures. + If you use no-copy receives (described in "OpenTransport.h") + you will need some of these routines, and may choose to use others. + See "Open Tranport Advanced Client Programming" for documentation. +*/ +/* + * OTBufferDataSize() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( OTByteCount ) +OTBufferDataSize(OTBuffer * buffer); + + +/* + * OTReadBuffer() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( Boolean ) +OTReadBuffer( + OTBufferInfo * buffer, + void * dest, + OTByteCount * len); + + +/* + * OTReleaseBuffer() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( void ) +OTReleaseBuffer(OTBuffer * buffer); + + + +#if CALL_NOT_IN_CARBON +/* + * StoreIntoNetbuf() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +StoreIntoNetbuf( + TNetbuf * netBuf, + void * source, + SInt32 len); + + +/* + * StoreMsgIntoNetbuf() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +StoreMsgIntoNetbuf( + TNetbuf * netBuf, + OTBuffer * buffer); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +/* ***** OTConfiguration ******/ +#if CALL_NOT_IN_CARBON +#if !OTKERNEL +/* + As promised in "OpenTransport.h", here are the routines + for advanced operations on configurations. +*/ +/* Manipulating a configuration*/ + +#if CALL_NOT_IN_CARBON +/* + * OTCfigNewConfiguration() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigNewConfiguration(const char * path); + + +/* + * OTCfigDeleteConfiguration() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCfigDeleteConfiguration(OTConfigurationRef cfig); + + +/* + * OTCfigCloneConfiguration() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigCloneConfiguration(OTConfigurationRef cfig); + + +/* + * OTCfigPushNewSingleChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigPushNewSingleChild( + OTConfigurationRef cfig, + const char * path, + OSStatus * errPtr); + + +/* + * OTCfigPushParent() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigPushParent( + OTConfigurationRef cfig, + const char * path, + OSStatus * errPtr); + + +/* + * OTCfigPushChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigPushChild( + OTConfigurationRef cfig, + OTItemCount index, + const char * path, + OSStatus * errPtr); + + +/* + * OTCfigPopChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTCfigPopChild( + OTConfigurationRef cfig, + OTItemCount index); + + +/* + * OTCfigGetChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigGetChild( + OTConfigurationRef cfig, + OTItemCount index); + + +/* + * OTCfigSetPath() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTCfigSetPath( + OTConfigurationRef cfig, + const char * path); + + +/* + * OTCfigNewChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigNewChild( + OTConfigurationRef cfig, + const char * path, + OSStatus * errPtr); + + +/* + * OTCfigAddChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTCfigAddChild( + OTConfigurationRef cfig, + OTConfigurationRef child); + + +/* + * OTCfigRemoveChild() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigRemoveChild( + OTConfigurationRef cfig, + OTItemCount index); + + +/* + * OTCfigSetPortRef() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCfigSetPortRef( + OTConfigurationRef cfig, + OTPortRef portRef); + + +/* + * OTCfigChangeProviderName() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCfigChangeProviderName( + OTConfigurationRef cfig, + const char * name); + + +/* Query a configuration*/ + +/* + * OTCfigNumberOfChildren() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( UInt16 ) +OTCfigNumberOfChildren(OTConfigurationRef cfig); + + +/* + * OTCfigGetParent() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTConfigurationRef ) +OTCfigGetParent(OTConfigurationRef cfig); + + +/* + * OTCfigGetOptionNetbuf() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( TNetbuf * ) +OTCfigGetOptionNetbuf(OTConfigurationRef cfig); + + +/* + * OTCfigGetPortRef() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTPortRef ) +OTCfigGetPortRef(OTConfigurationRef cfig); + + +/* + * OTCfigGetInstallFlags() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( UInt32 ) +OTCfigGetInstallFlags(OTConfigurationRef cfig); + + +/* + * OTCfigGetProviderName() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( const char * ) +OTCfigGetProviderName(OTConfigurationRef cfig); + + +/* + * OTCfigIsPort() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTCfigIsPort(OTConfigurationRef cfig); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +/* ***** Configurators ******/ +/* + The kOTConfiguratorInterfaceID define is what you need to add to your + export file for the "interfaceID = " clause to export a configurator + for ASLM. Similarly, kOTConfiguratorCFMTag is used for CFM-based + configurators. +*/ + + +#define kOTConfiguratorInterfaceID kOTClientPrefix "cfigMkr" +#define kOTConfiguratorCFMTag kOTClientPrefix "cfigMkr" + +#if !OTKERNEL +#ifdef __cplusplus + class TOTConfigurator; + typedef class TOTConfigurator* TOTConfiguratorRef; +#else + typedef struct TOTConfigurator TOTConfigurator; + typedef TOTConfigurator* TOTConfiguratorRef; +#endif +/* + Typedef for the OTCanConfigure function, and the enum for which pass we're doing. + The first (kOTSpecificConfigPass) is to give configurators a shot at the configuration + before we start allowing the generic configurators to get into the act. +*/ +enum { + kOTSpecificConfigPass = 0, + kOTGenericConfigPass = 1 +}; + +typedef CALLBACK_API_C( Boolean , OTCanConfigureProcPtr )(OTConfigurationRef cfig, UInt32 pass); +/* Typedef for the function to create and return a configurator object*/ +typedef CALLBACK_API_C( OSStatus , OTCreateConfiguratorProcPtr )(TOTConfiguratorRef * cfigor); +/* + Typedef for the "OTSetupConfigurator" function that your configurator library must export. + The enum is for the type of configurator that it is. +*/ +#define kOTSetupConfiguratorID "OTSetupConfigurator" +enum { + kOTDefaultConfigurator = 0, + kOTProtocolFamilyConfigurator = 1, + kOTLinkDriverConfigurator = 2 +}; + +typedef CALLBACK_API_C( OSStatus , OTSetupConfiguratorProcPtr )(OTCanConfigureProcPtr *canConfigure, OTCreateConfiguratorProcPtr *createConfigurator, UInt8 *configuratorType); +/* + Procedure pointer definitions for the three key callbacks associated + with a configurator, as established by OTNewConfigurator. +*/ +typedef CALLBACK_API_C( OSStatus , OTCFConfigureProcPtr )(TOTConfiguratorRef cfigor, OTConfigurationRef cfig); +typedef CALLBACK_API_C( OSStatus , OTCFCreateStreamProcPtr )(TOTConfiguratorRef cfigor, OTConfigurationRef cfig, OTOpenFlags oFlags, OTNotifyUPP proc, void *contextPtr); +typedef CALLBACK_API_C( void , OTCFHandleSystemEventProcPtr )(TOTConfiguratorRef cfigor, OTEventCode code, OTResult result, void *cookie); +/* + Determine if this instance of your configurator is the "master" + (the one that can create and destroy control streams) +*/ +#if CALL_NOT_IN_CARBON +/* + * OTIsMasterConfigurator() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTIsMasterConfigurator(TOTConfiguratorRef cfigor); + + +/* Get back the userData you passed in to OTNewConfigurator*/ +/* + * OTGetConfiguratorUserData() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void * ) +OTGetConfiguratorUserData(TOTConfiguratorRef cfigor); + + +/* Create a configurator object for use by Open Transport*/ +/* + * OTNewConfigurator() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( TOTConfiguratorRef ) +OTNewConfigurator( + void * userData, + OTCFConfigureProcPtr configure, + OTCFCreateStreamProcPtr createStream, + OTCFHandleSystemEventProcPtr handleEvent); + + +/* Delete a configurator object created by OTNewConfigurator*/ +/* + * OTDeleteConfigurator() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTDeleteConfigurator(TOTConfiguratorRef cfigor); + + +/* + A utility function to send notifications to the user - it takes care of calls + from deferred tasks +*/ +/* + * OTNotifyUser() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTNotifyUser( + FSSpec * theFile, + SInt32 rsrcID, + OTItemCount index, + char * parm1, + char * parm2); + + +/* Call when the configurator unloads from memory*/ +/* + * OTConfiguratorUnloaded() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTConfiguratorUnloaded(TOTConfiguratorRef cfigor); + + +/* + Call to create your control stream if you're not the master + configurator. You can also use the state machine function + OTSMCreateControlStream(OTStateMachine*, OTConfigurationRef, TOTConfiguratorRef cfigor). +*/ +/* + * OTCreateControlStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTCreateControlStream( + OTConfigurationRef cfig, + TOTConfiguratorRef cfigor, + OTNotifyUPP proc, + void * contextPtr); + + +/* + A helpful function for the configurators to + be able to recursively configure the children. +*/ +/* + * OTConfigureChildren() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTConfigureChildren(OTConfigurationRef cfig); + + +/* Allocate a bit in the system-wide control mask for streams.*/ +/* + * OTNewControlMask() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( UInt32 ) +OTNewControlMask(void); + + +/* Warning: These 2 APIs is going away*/ +/* + * OTCloseProvidersByUseCount() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCloseProvidersByUseCount( + SInt32 * useCount, + OTResult reason, + OTBooleanParam doneDeal); + + +/* + * OTCloseProvidersByPortRef() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCloseProvidersByPortRef( + OTPortRef ref, + OTResult reason, + OTBooleanParam doneDeal); + + +/* These are the "real" APIs*/ +/* + * OTCloseProviderByStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCloseProviderByStream( + StreamRef ref, + OTResult reason, + OTBooleanParam doneDeal); + + +/* + * OTCloseMatchingProviders() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTCloseMatchingProviders( + UInt32 mask, + OTPortRef port, + OTResult reason, + OTBooleanParam doneDeal); + + + +/* The following defines are for use in building an 'epcf' resource: */ + +/* Defines for fFlags field: */ +#define kIsReliable 0x00000001 +#define kIsNotReliable 0x00000002 +#define kSupportsOrderlyRelease 0x00000004 + +/* Defines for fProtocolType field: */ +#define kStream 0x0001 +#define kUStream 0x0002 +#define kTransaction 0x0004 +#define kUTransaction 0x0008 +#define kMapper 0x0010 +#define kGenericProtocol 0x0020 + +/* Defines for optionType field: */ +#define kBooleanOption 0 +#define kUnsignedValueOption 1 +#define kSignedValueOption 2 +#define kHexValueOption 3 +#define kPrintableStringOption 4 +#define kOctetStringOption 5 + +/* Defines for fUpperInterface and fLowerInterface: */ +#define kTPIInterface 'TPI ' +#define kDLPIInterface 'DLPI' +#define kMapperInterface 'MAPR' +#define kPrivateInterface -1 +#define kNoInterface 0 + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +#endif /* CALL_NOT_IN_CARBON */ + +/* ***** OTStateMachine ******/ +#if CALL_NOT_IN_CARBON +/* + This utility set allows you to write an asynchronous chain of code that looks + somewhat like it is synchronous. This is primarily used for plumbing + streams asynchronously, especially in configurators +*/ +#if !OTKERNEL +/* Alas, the state machine is only available to client code. Sorry.*/ + +/* + There are 12 or 8 bytes of reserved space at the front of + the OTStateMachine structure, depending on whether you're + building PowerPC or 68K code.. The OTStateMachineDataPad + type compensates for this. +*/ + +#if TARGET_CPU_PPC +typedef UInt8 OTStateMachineDataPad[12]; +#else +typedef UInt8 OTStateMachineDataPad[8]; +#endif /* TARGET_CPU_PPC */ + +/* + Forward define OTStateMachine so that OTStateProcPtr has + access to it. +*/ +typedef struct OTStateMachine OTStateMachine; +/* + This type is is the required prototype of a state machine + entry point. +*/ +typedef CALLBACK_API( void , OTStateProcPtr )(OTStateMachine * sm); +/* + This type defines a routine that the state machine will + call when the top level completes. +*/ +typedef CALLBACK_API_C( void , OTSMCompleteProcPtr )(void * contextPtr); +/* And now for the state machine structure itself.*/ +struct OTStateMachine { + OTStateMachineDataPad fData; + void * fCookie; + OTEventCode fCode; + OTResult fResult; +#ifdef __cplusplus + + // C++ inline methods on this structure. + + + + void* GetClientData(); + + Boolean CallStateProc(OTStateProcPtr proc, UInt32 state = 0); + + UInt16 GetState(); + + void SetState(UInt32 state); + + void Complete(); + + void Complete(OTResult result); + + void Complete(OTResult result, OTEventCode code, void* contextPtr); + + void CompleteToClient(); + + void CompleteToClient(OTResult result); + + void CompleteToClient(OTResult result, OTEventCode code, void* contexPtr); + + void PopCallback(); + + Boolean CreateStream(OTConfigurationRef cfig, OTOpenFlags flags); + + Boolean OpenStream(const char* name, OTOpenFlags flags); + + Boolean SendIoctl(StreamRef ref, UInt32 type, void* data); + + Boolean SendIoctl(StreamRef ref, UInt32 type, long data); + + Boolean PutMessage(StreamRef ref, strbuf* ctl, strbuf* data, OTFlags flags); + + Boolean GetMessage(StreamRef ref, strbuf* ctl, strbuf* data, OTFlags* flagPtr); + + OSStatus ReturnToCaller(); + +#endif + +}; + +#define kOTSMBufferSize(callDepth) (80 + (callDepth * 8)) +/* + For structSize, pass the size of your structure that you want associated with + the state machine. It can later be obtained by calling OTSMGetClientData. + For bufSize, use the kOTSMBufferSize macro, plus the size of your structure + to create a buffer on the stack. For synchronous calls, the stack buffer will + be used (unless you pass in NULL). The callDepth is the depth level of nested + calls using OTSMCallStateProc. +*/ +#if CALL_NOT_IN_CARBON +/* + * OTCreateStateMachine() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTStateMachine * ) +OTCreateStateMachine( + void * buf, + OTByteCount bufSize, + OTByteCount structSize, + OTNotifyUPP proc, + void * contextPtr); + + +/* + * OTDestroyStateMachine() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTDestroyStateMachine(OTStateMachine * sm); + + +/* + OTSMCallStateProc used to take a parameter of type UInt16_p, + which was defined to be the same as UInt32. In an attempt + to reduce the number of wacky types defined by the OT + interfaces, we've changed these routines to just take a + straight UInt32. You should be warned that the current + implementation does not support values outside of the + range 0..32767. The same applies to OTSMSetState. +*/ + +/* + * OTSMCallStateProc() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMCallStateProc( + OTStateMachine * sm, + OTStateProcPtr proc, + UInt32 state); + + +/* + * OTSMGetState() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( UInt16 ) +OTSMGetState(OTStateMachine * sm); + + +/* + * OTSMSetState() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTSMSetState( + OTStateMachine * sm, + UInt32 state); + + +/* Fill out the fCookie, fCode, and fResult fields before calling!*/ +/* + * OTSMComplete() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTSMComplete(OTStateMachine * sm); + + +/* + * OTSMPopCallback() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTSMPopCallback(OTStateMachine * sm); + + +/* + * OTSMWaitForComplete() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMWaitForComplete(OTStateMachine * sm); + + +/* + * OTSMCreateStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMCreateStream( + OTStateMachine * sm, + OTConfigurationRef cfig, + OTOpenFlags flags); + + +/* + * OTSMOpenStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMOpenStream( + OTStateMachine * sm, + const char * name, + OTOpenFlags flags); + + +/* + * OTSMIoctl() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMIoctl( + OTStateMachine * sm, + StreamRef strm, + UInt32 cmd, + long data); + + +/* + * OTSMPutMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMPutMessage( + OTStateMachine * sm, + StreamRef strm, + strbuf * ctlbuf, + strbuf * databuf, + OTFlags flags); + + +/* + * OTSMGetMessage() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMGetMessage( + OTStateMachine * sm, + StreamRef strm, + strbuf * ctlbuf, + strbuf * databuf, + OTFlags * flagsPtr); + + +/* + * OTSMReturnToCaller() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTSMReturnToCaller(OTStateMachine * sm); + + +/* + * OTSMGetClientData() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void * ) +OTSMGetClientData(OTStateMachine * sm); + + +/* + * OTSMInstallCompletionProc() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTSMInstallCompletionProc( + OTStateMachine * sm, + OTSMCompleteProcPtr completeProc, + void * contextPtr); + + +/* + * OTSMCreateControlStream() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTSMCreateControlStream( + OTStateMachine * sm, + OTConfigurationRef cfig, + TOTConfiguratorRef cfigor); + + + +#ifdef __cplusplus + inline void* OTStateMachine::GetClientData() { return OTSMGetClientData(this); } + inline Boolean OTStateMachine::CallStateProc(OTStateProcPtr proc, UInt32 state) + { return OTSMCallStateProc(this, proc, state); } + inline UInt16 OTStateMachine::GetState() { return OTSMGetState(this); } + inline void OTStateMachine::SetState(UInt32 state) + { OTSMSetState(this, state); } + inline void OTStateMachine::PopCallback() { OTSMPopCallback(this); } + inline void OTStateMachine::Complete() { OTSMComplete(this); } + inline void OTStateMachine::Complete(OTResult result, OTEventCode code, void* cookie) + { fCookie = cookie; fCode = code; fResult = result; Complete(); } + inline void OTStateMachine::Complete(OTResult result) + { fResult = result; Complete(); } + inline void OTStateMachine::CompleteToClient() + { PopCallback(); Complete(); } + inline void OTStateMachine::CompleteToClient(OTResult result) + { fResult = result; CompleteToClient(); } + + inline void OTStateMachine::CompleteToClient(OTResult result, OTEventCode code, void* cookie) + { fCookie = cookie; fCode = code; fResult = result; CompleteToClient(); } + inline Boolean OTStateMachine::CreateStream(OTConfigurationRef cfig, OTOpenFlags flags) + { return OTSMCreateStream(this, cfig, flags); } + inline Boolean OTStateMachine::OpenStream(const char* name, OTOpenFlags flags) + { return OTSMOpenStream(this, name, flags); } + inline Boolean OTStateMachine::SendIoctl(StreamRef ref, UInt32 type, void* data) + { return OTSMIoctl(this, ref, type, (long)data); } + inline Boolean OTStateMachine::SendIoctl(StreamRef ref, UInt32 type, long data) + { return OTSMIoctl(this, ref, type, data); } + inline Boolean OTStateMachine::PutMessage(StreamRef ref, struct strbuf* ctl, struct strbuf* data, OTFlags flags) + { return OTSMPutMessage(this, ref, ctl, data, flags); } + inline Boolean OTStateMachine::GetMessage(StreamRef ref, struct strbuf* ctl, struct strbuf* data, OTFlags* flagPtr) + { return OTSMGetMessage(this, ref, ctl, data, flagPtr); } + inline OSStatus OTStateMachine::ReturnToCaller() + { return OTSMReturnToCaller(this); } +#endif + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +/* ***** Autopush Definitions ******/ +/* + The autopush functionality for Open Transport is based on the names of + devices and modules, rather than on the major number information like + SVR4. This is so that autopush information can be set up for modules + that are not yet loaded. +*/ + + +/* The name of the STREAMS driver you open and send the ioctls to.*/ +#define kSADModuleName "sad" +/* Autopush ioctls.*/ +enum { + I_SAD_SAP = ((MIOC_SAD << 8) | 1), /* Set autopush information */ + I_SAD_GAP = ((MIOC_SAD << 8) | 2), /* Get autopush information */ + I_SAD_VML = ((MIOC_SAD << 8) | 3) /* Validate a list of modules (uses str_list structure) */ +}; + +/* Maximum number of modules autopushed on a driver.*/ + +enum { + kOTAutopushMax = 8 +}; + + +/* ioctl structure used for SAD_SAP and SAD_GAP commands.*/ + +struct OTAutopushInfo { + UInt32 sap_cmd; + char sap_device_name[32]; + SInt32 sap_minor; + SInt32 sap_lastminor; + SInt32 sap_npush; + char sap_list[8][32]; +}; +typedef struct OTAutopushInfo OTAutopushInfo; +/* Command values for sap_cmd field of the above.*/ +enum { + kSAP_ONE = 1, /* Configure a single minor device */ + kSAP_RANGE = 2, /* Configure a range of minor devices */ + kSAP_ALL = 3, /* Configure all minor devices */ + kSAP_CLEAR = 4 /* Clear autopush information */ +}; + + +/* ***** Configuration Helpers ******/ + +/* + These definitions are used by device driver and port scanner + developers to provide a library giving client-side information about + the registered ports, such as a user-visible name or an icon. +*/ + +/* Configuration helper library prefix*/ + +/* + This prefix is prepended to the string found in the "fResourceInfo" + field of the OTPortRecord to build the actual library name of the + configuration helper library. +*/ + +#define kPortConfigLibPrefix "OTPortCfg$" + +/* Get user visible port name entry point.*/ + +/* + This entry point returns the user visible name of the port. If includeSlot + is true, a slot distinguishing suffix (eg "slot X") should be added. If + includePort is true, a port distinguishing suffix (eg " port X") should be added for + multiport cards. +*/ + +#define kOTGetUserPortNameID "OTGetUserPortName" +typedef CALLBACK_API_C( void , OTGetPortNameProcPtr )(OTPortRecord *port, OTBooleanParam includeSlot, OTBooleanParam includePort, Str255 userVisibleName); +/* Get icon entry point.*/ +/* + This entry point returns the location of the icon for the port. Return false if no + icon is provided. +*/ + +#define kOTGetPortIconID "OTGetPortIcon" +struct OTResourceLocator { + FSSpec fFile; + UInt16 fResID; +}; +typedef struct OTResourceLocator OTResourceLocator; +typedef CALLBACK_API_C( Boolean , OTGetPortIconProcPtr )(OTPortRecord *port, OTResourceLocator *iconLocation); +/* ***** Application Access to Configuration Helpers ******/ + +#if !OTKERNEL +/* + These routines are used by clients to get information about ports. + The canonical user of these routines is the OT control panel(s), + but applications may want to use them as well (to display the list + of available Ethernet cards, for example). +*/ +/* Returns a user friendly name for a port.*/ +#if CALL_NOT_IN_CARBON +/* + * OTGetUserPortNameFromPortRef() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTGetUserPortNameFromPortRef( + OTPortRef ref, + Str255 friendlyName); + + +/* + Returns the location for the icon familly representing the port. + Returns false if the port has no icon. +*/ +/* + * OTGetPortIconFromPortRef() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTGetPortIconFromPortRef( + OTPortRef ref, + OTResourceLocator * iconLocation); + + +#endif /* CALL_NOT_IN_CARBON */ + +/* Returns true if the port can be used with the specified protocol.*/ +#if CALL_NOT_IN_CARBON +/* + * OTIsPortCompatibleWith() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTIsPortCompatibleWith( + const OTPortRecord * port, + char * protocolName); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !OTKERNEL */ + +#endif /* CALL_NOT_IN_CARBON */ + +/* ***** Common Utilities ******/ +/* + The utilities defined in this section are available to both client + and kernel code. Cool huh? These utilities differ from those + provided in "OpenTransport.h" in that they are only available to native + architecture clients. +*/ + +/* Bitmap functions*/ + +/* These functions atomically deal with a bitmap that is multiple-bytes long*/ + +/* + Set the first clear bit in "bitMap", starting with bit "startBit", + giving up after "numBits". Returns the bit # that was set, or + a kOTNotFoundErr if there was no clear bit available +*/ +/* + * OTSetFirstClearBit() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( OTResult ) +OTSetFirstClearBit( + UInt8 * bitMap, + OTByteCount startBit, + OTByteCount numBits); + + +/* Standard clear, set and test bit functions*/ +/* + * OTClearBit() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( Boolean ) +OTClearBit( + UInt8 * bitMap, + OTByteCount bitNo); + + +/* + * OTSetBit() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( Boolean ) +OTSetBit( + UInt8 * bitMap, + OTByteCount bitNo); + + +/* + * OTTestBit() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: in CarbonLib 1.0 and later + * Mac OS X: in version 10.0 and later + */ +EXTERN_API_C( Boolean ) +OTTestBit( + UInt8 * bitMap, + OTByteCount bitNo); + + +/* OTHashList*/ + +/* + This implements a simple, but efficient hash list. It is not + thread-safe. +*/ + +typedef CALLBACK_API_C( UInt32 , OTHashProcPtr )(OTLink * linkToHash); +typedef CALLBACK_API_C( Boolean , OTHashSearchProcPtr )(const void *ref, OTLink *linkToCheck); +struct OTHashList { + OTHashProcPtr fHashProc; + ByteCount fHashTableSize; + OTLink ** fHashBuckets; +#ifdef __cplusplus + + // C++ inline methods on this structure. + + + + void Add(OTLink* toAdd); + + Boolean RemoveLink(OTLink* toRemove); + + OTLink* Remove(OTHashSearchProcPtr proc, const void* refPtr, UInt32 hashValue); + + Boolean IsInList(OTLink* toFind); + + OTLink* FindLink(OTHashSearchProcPtr proc, const void* refPtr, UInt32 hash); + +#endif + +}; +typedef struct OTHashList OTHashList; +/* + Return the number of bytes of memory needed to create a hash list + of at least "numEntries" entries. +*/ +#if CALL_NOT_IN_CARBON +/* + * OTCalculateHashListMemoryNeeds() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTByteCount ) +OTCalculateHashListMemoryNeeds(OTItemCount numEntries); + + +/* + Create an OTHashList from "memory". Return an error if it + couldn't be done. +*/ +/* + * OTInitHashList() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTResult ) +OTInitHashList( + void * memory, + OTByteCount numBytes, + OTHashProcPtr hashProc); + + +/* + * OTAddToHashList() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTAddToHashList( + OTHashList * hashList, + OTLink * linkToAdd); + + +/* + * OTRemoveLinkFromHashList() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTRemoveLinkFromHashList( + OTHashList * hashList, + OTLink * linkToRemove); + + +/* + * OTIsInHashList() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTIsInHashList( + OTHashList * hashList, + OTLink * link); + + +/* + * OTFindInHashList() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTLink * ) +OTFindInHashList( + OTHashList * hashList, + OTHashSearchProcPtr searchProc, + const void * refPtr, + UInt32 hashValue); + + +/* + * OTRemoveFromHashList() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OTLink * ) +OTRemoveFromHashList( + OTHashList * hashList, + OTHashSearchProcPtr searchProc, + const void * refPtr, + UInt32 hashValue); + + +#endif /* CALL_NOT_IN_CARBON */ + +#ifdef __cplusplus + #if CALL_NOT_IN_CARBON + // C++ inline methods on this structure. + + inline void OTHashList::Add(OTLink* toAdd) { OTAddToHashList(this, toAdd); } + + inline Boolean OTHashList::RemoveLink(OTLink* toRemove) + { return OTRemoveLinkFromHashList(this, toRemove); } + inline OTLink* OTHashList::Remove(OTHashSearchProcPtr proc, const void* refPtr, UInt32 hashValue) + { return OTRemoveFromHashList(this, proc, refPtr, hashValue); } + inline Boolean OTHashList::IsInList(OTLink* toFind) + { return OTIsInHashList(this, toFind); } + inline OTLink* OTHashList::FindLink(OTHashSearchProcPtr proc, const void* refPtr, UInt32 hash) + { return OTFindInHashList(this, proc, refPtr, hash); } + #endif +#endif +/* Random functions*/ + +/* + These implement a very simple random number generator, suitable + for protocol implementations but not "cryptographically" random. +*/ + +#if CALL_NOT_IN_CARBON +/* + * OTGetRandomSeed() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( UInt32 ) +OTGetRandomSeed(void); + + +/* + * OTGetRandomNumber() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( UInt32 ) +OTGetRandomNumber( + UInt32 * seed, + UInt32 lo, + UInt32 hi); + + +/* Concurrency Control*/ + +/* + OTGate implements a cool concurrency control primitive. + You're not going to understand it without reading the documentation! + See "Open Transport Advanced Client Programming" for details. + WARNING: + This structure must be on a 4-byte boundary. +*/ + +#endif /* CALL_NOT_IN_CARBON */ + +typedef CALLBACK_API_C( Boolean , OTGateProcPtr )(OTLink * thisLink); +struct OTGate { + OTLIFO fLIFO; + OTList fList; + OTGateProcPtr fProc; + SInt32 fNumQueued; + SInt32 fInside; +}; +typedef struct OTGate OTGate; +#if CALL_NOT_IN_CARBON +/* + * OTInitGate() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTInitGate( + OTGate * gate, + OTGateProcPtr proc); + + +/* + * OTEnterGate() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTEnterGate( + OTGate * gate, + OTLink * withLink); + + +/* + * OTLeaveGate() + * + * Availability: + * Non-Carbon CFM: in OTUtilityLib 1.0 and later + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( Boolean ) +OTLeaveGate(OTGate * gate); + + +/* ***** Shared Library Bonus Extras ******/ + +#endif /* CALL_NOT_IN_CARBON */ + +#if CALL_NOT_IN_CARBON +/* + These routines provide addition shared library support beyond + that provided by the base shared library mechanism. +*/ +/* + Some flags which can be passed to the "loadFlags" parameter of the + various CFM routines. Not all flags can be used with all routines. + See "Open Transport Advanced Client Programming" for details. +*/ + +enum { + kOTGetDataSymbol = 0, + kOTGetCodeSymbol = 1, + kOTLoadNewCopy = 2, + kOTLoadACopy = 4, + kOTFindACopy = 8, + kOTLibMask = kOTLoadNewCopy | kOTLoadACopy | kOTFindACopy, + kOTLoadLibResident = 0x20 +}; + +/* Finding all matching CFM libraries.*/ + +/* + The routine OTFindCFMLibraries allows you to find all CFM libraries + that match specific criteria. The result is placed in a list + of CFMLibraryInfo structures. OT allocates those structures using + a routine of type OTAllocMemProcPtr that you pass to OTFindCFMLibraries. +*/ + +/* + A list of CFMLibraryInfo structures is returned by the OTFindCFMLibraries routine. + The list is created out of the data that is passed to the function. + + IMPORTANT: + Only the first 3 fields are valid when using OT 1.2 and older. +*/ + +struct CFMLibraryInfo { + OTLink link; /* To link them all up on a list */ + char * libName; /* "C" String which is fragment name */ + StringPtr intlName; /* Pascal String which is internationalized name */ + FSSpec * fileSpec; /* location of fragment's file */ + StringPtr pstring2; /* Secondary string from extended cfrg */ + StringPtr pstring3; /* Extra info from extended cfrg */ +}; +typedef struct CFMLibraryInfo CFMLibraryInfo; +/* + You must pass a routine of type OTAllocMemProcPtr to OTFindCFMLibraries + which it calls to allocate memory for the CFMLibraryInfo structures. +*/ +typedef CALLBACK_API_C( void *, OTAllocMemProcPtr )(OTByteCount size); +/* Find CFM libraries of the specified kind and type*/ +#if CALL_NOT_IN_CARBON +/* + * OTFindCFMLibraries() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTFindCFMLibraries( + OSType libKind, + const char * libType, + OTList * theList, + OTAllocMemProcPtr allocator); + + +/* Loading libraries and connecting to symbols.*/ + +/* Load a CFM library by name*/ +/* + * OTLoadCFMLibrary() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTLoadCFMLibrary( + const char * libName, + UInt32 * connID, + UInt32 loadFlags); + + +/* Load a CFM library and get a named pointer from it*/ +/* + * OTGetCFMPointer() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void * ) +OTGetCFMPointer( + const char * libName, + const char * entryName, + UInt32 * connID, + UInt32 loadFlags); + + +/* Get a named pointer from a CFM library that's already loaded*/ +/* + * OTGetCFMSymbol() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void * ) +OTGetCFMSymbol( + const char * entryName, + UInt32 connID, + UInt32 loadFlags); + + +/* Release a connection to a CFM library*/ +/* + * OTReleaseCFMConnection() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTReleaseCFMConnection(UInt32 * connID); + + +#endif /* CALL_NOT_IN_CARBON */ + +#if !TARGET_CPU_68K +/* + You can call these routines in your CFM initialisation and termination + routines to hold or unhold your libraries sections. +*/ +/* + Used in a CFM InitProc, will hold the executable code, if applicable. + This can also be the InitProc of the library +*/ +#if CALL_NOT_IN_CARBON +/* + * OTHoldThisCFMLibrary() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTHoldThisCFMLibrary(const CFragInitBlock * initBlock); + + +/* + Used in a CFM terminate proc, will unhold the executable code, if applicable. + This can also be the terminate proc of the library +*/ +/* + * OTUnholdThisCFMLibrary() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTUnholdThisCFMLibrary(void); + + +#endif /* CALL_NOT_IN_CARBON */ + +#endif /* !TARGET_CPU_68K */ + +/* ASLM Utilities*/ +/* Load an ASLM library*/ +#if CALL_NOT_IN_CARBON +/* + * OTLoadASLMLibrary() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( OSStatus ) +OTLoadASLMLibrary(const char * libName); + + +/* Unload an ASLM library*/ +/* + * OTUnloadASLMLibrary() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +OTUnloadASLMLibrary(const char * libName); + + +/* + This is an ASLM utility routine. You can get it by including + "LibraryManagerUtilities.h", but since we only use a few ASLM utilities, + we put the prototype here for convenience. +*/ + +/* + * UnloadUnusedLibraries() + * + * Availability: + * Non-Carbon CFM: not available + * CarbonLib: not available + * Mac OS X: not available + */ +EXTERN_API_C( void ) +UnloadUnusedLibraries(void); + + + +#endif /* CALL_NOT_IN_CARBON */ + +#if !OTKERNEL +/******************************************************************************* +** A few C++ objects for C++ fans +********************************************************************************/ +#if CALL_NOT_IN_CARBON + +#ifdef __cplusplus +} // Terminate C definitions + + class OTConfiguration + { + public: + OTConfigurationRef Clone() + { return OTCfigCloneConfiguration(this); } + // + // The Path for PushChild and PushParent must be a single module + // + OTConfigurationRef PushChild(const char* path, OSStatus* errPtr) + { return OTCfigPushNewSingleChild(this, path, errPtr); } + OTConfigurationRef PushParent(const char* path, OSStatus* errPtr) + { return OTCfigPushParent(this, path, errPtr); } + OTConfigurationRef PushNthChild(OTItemCount index, const char* path, + OSStatus* errPtr) + { return OTCfigPushChild(this, index, path, errPtr); } + OSStatus PopChild(OTItemCount index) + { return OTCfigPopChild(this, index); } + + OTConfigurationRef GetChild(OTItemCount index = 0) + { return OTCfigGetChild(this, index); } + OTConfigurationRef GetParent() + { return OTCfigGetParent(this); } + + OSStatus AddChild(OTConfigurationRef child) + { return OTCfigAddChild(this, child); } + + OTConfigurationRef NewChild(const char* path, OSStatus* errPtr) + { return OTCfigNewChild(this, path, errPtr); } + + OSStatus SetPath(const char* path) + { return OTCfigSetPath(this, path); } + + Boolean HasOptions() + { return OTCfigGetOptionNetbuf(this)->len != 0; } + }; + +/* ------------------------------------------------------------------------- + Class TOTConfigurator + + This class is subclassed to do configuration for a protocol or protocol stack. + Of course, you can also use OTNewConfigurator to do it from C. + + If you subclass it using C++, you MUST have a UInt32 field as the first + field of your object that you do not touch or use. + ------------------------------------------------------------------------- */ + +#if TARGET_CPU_68K && !defined(__SC__) && !defined(THINK_CPLUS) + class TOTConfigurator : public SingleObject +#else + class TOTConfigurator +#endif + { + #if defined(__SC__) || defined(THINK_CPLUS) || defined(__MRC__) + private: + virtual void DummyVirtualFunction(); + #endif + + public: + void* operator new(size_t size) + { return OTAllocSharedClientMem((OTByteCount)size); } + void operator delete(void* mem) + { OTFreeSharedClientMem(mem); }; + + _MDECL TOTConfigurator(); + virtual ~ _MDECL TOTConfigurator(); + + virtual void _MDECL HandleSystemEvent(OTEventCode event, OTResult result, + void* cookie) = 0; + + virtual OSStatus _MDECL Configure(OTConfigurationRef) = 0; + virtual OSStatus _MDECL CreateStream(OTConfigurationRef, OTOpenFlags, + OTNotifyUPP, void* contextPtr) = 0; + }; + +extern "C" { // resume C definitions +#endif /*__cplusplus*/ + +#endif /* CALL_NOT_IN_CARBON */ +#endif /* !OTKERNEL */ + +#endif /* CALL_NOT_IN_CARBON */ + +#if defined(__MWERKS__) && TARGET_CPU_68K + #pragma pop +#endif + + +#if PRAGMA_STRUCT_ALIGN + #pragma options align=reset +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(pop) +#elif PRAGMA_STRUCT_PACK + #pragma pack() +#endif + +#ifdef PRAGMA_IMPORT_OFF +#pragma import off +#elif PRAGMA_IMPORT +#pragma import reset +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENTRANSPORTPROTOCOL__ */ + |