|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1991 Microsoft Corporation
4:
5: Module Name:
6:
7: stream.h
8:
9: Abstract:
10:
11: This module declares the data types and functions available to
12: STREAMS drivers and modules.
13:
14: Author:
15:
16: Eric Chin (ericc) August 9, 1991
17:
18: Revision History:
19:
20: Who When What
21: -------- -------- -----------------------------------------------------
22: sampa 09-19-91 pulled kernel level stuff from stream.h
23: mikemas 01-18-92 removed redefinition of STREAMS functions and
24: reorganized file.
25: mikemas 01-20-92 integrated private\inc\stream.h into this file.
26: moved to streams\inc\stream.h from ntstream.h
27:
28: --*/
29:
30: /******************************************************************
31: *
32: * SpiderSTREAMS - STREAMS Package
33: *
34: * Copyright 1987 Spider Systems Limited
35: *
36: * STREAM.H
37: *
38: * Main STREAMS definitions
39: *
40: ******************************************************************/
41:
42: /*
43: * /usr/projects/spare/PBRAIN/SCCS/pbrainG/dev/stremul/include/sys/114/s.stream.h
44: * @(#)stream.h 1.36
45: *
46: * Last delta created 12:37:24 12/4/91
47: * This file extracted 16:45:56 12/23/91
48: *
49: * Modifications:
50: *
51: */
52:
53:
54: #ifndef _SYS_STREAM_INCLUDED
55: #define _SYS_STREAM_INCLUDED
56:
57:
58:
59: /********************************************************/
60: /* Streams message and queue types */
61: /********************************************************/
62:
63: /*
64: * Message block descriptor
65: */
66: struct msgb {
67: struct msgb *b_next; /* next message on queue */
68: struct msgb *b_prev; /* previous message on queue */
69: struct msgb *b_cont; /* next message block of message */
70: unsigned char *b_rptr; /* first unread data byte in buffer */
71: unsigned char *b_wptr; /* first unwritten data byte in buffer */
72: struct datab *b_datap; /* data block */
73: unsigned char b_rsvd; /* in SVR4, this is b_band */
74: unsigned char b_pad1;
75: unsigned short b_flag; /* message flag field */
76: long b_pad2;
77: };
78:
79:
80: /*
81: * Message flags. These are interpreted by the Stream Head.
82: */
83: #define MSGMARK 0x01 /* marked block - for I_ATMARK */
84: #define MSGNLOOP 0x02 /* don't loop message to write queue */
85: #define MSGDELIM 0x04 /* message is delimited */
86:
87:
88: /*
89: * structure containing function to call and argument when freeing
90: * an extended buffer
91: */
92: struct free_rtn {
93: void (*free_func)(char *); /* free routine of user */
94: char *free_arg; /* argument to free routine */
95: };
96:
97:
98: /*
99: * Data block descriptor
100: *
101: */
102: struct datab {
103: struct datab *db_freep; /* used internally */
104: unsigned char *db_base; /* first byte of buffer */
105: unsigned char *db_lim; /* last byte + 1 of buffer */
106: unsigned long db_ref; /* count of msgs pointing to block */
107: unsigned char db_type; /* message type */
108: unsigned char db_class; /* used internally. In SVR4, is db_iswhat */
109: KSPIN_LOCK db_lock; /* protects db_ref */
110:
111: /* unused SVR4 fields, for future expansion */
112: unsigned int db_rsvd1; /* db_size */
113: char *db_rsvd2; /* db_msgaddr */
114: long db_filler; /* reserved for future use */
115:
116: /* unique to SpiderSTREAMS */
117: struct free_rtn db_discard; /* call routine & arg to free buffer */
118: };
119:
120:
121: struct queue; // define queue name so the MIPS compiler will recognize it
122: // in the following definition as being the same as the
123: // queue structure definition that will follow later.
124:
125:
126: /*
127: * Queue Information Structure
128: *
129: */
130: struct qinit { /* declares a queue */
131: int (*qi_putp)( /* put procedure */
132: struct queue *q,
133: struct msgb *mp
134: );
135: int (*qi_srvp)( /* service procedure */
136: struct queue *
137: );
138: int (*qi_qopen)( /* open procedure */
139: struct queue *,
140: dev_t *,
141: int,
142: int,
143: void *
144: );
145: int (*qi_qclose)( /* close procedure */
146: struct queue *,
147: int,
148: void *
149: );
150: int (*qi_qadmin)(); /* unused */
151: struct module_info *qi_minfo; /* module information */
152: struct module_stat *qi_mstat; /* module statistics */
153: int qi_mplevel; /* level of parallelism */
154: };
155:
156:
157: #define FULL_PARALLEL -1 /* fully parallelised */
158: #define STREAM_PARALLEL -2 /* streams parallel: NOT SUPPORTED */
159:
160:
161: /*
162: * Module information structure
163: */
164: struct module_info {
165: unsigned short mi_idnum; /* module id number */
166: char *mi_idname; /* module name */
167: long mi_minpsz; /* min packet size accepted */
168: long mi_maxpsz; /* max packet size accepted */
169: unsigned long mi_hiwat; /* hi-water mark */
170: unsigned long mi_lowat; /* lo-water mark */
171: };
172:
173:
174: /*
175: * Module statistics structure (not used in current implementation)
176: */
177: struct module_stat {
178: long ms_pcnt; /* count of calls to put proc */
179: long ms_scnt; /* count of calls to service proc */
180: long ms_ocnt; /* count of calls to open proc */
181: long ms_ccnt; /* count of calls to close proc */
182: long ms_acnt; /* count of calls to admin proc */
183: char *ms_xptr; /* pointer to private statistics */
184: short ms_xsize; /* length of private statistics buffer */
185: };
186:
187:
188: /*
189: * Streamtab (used in cdevsw and fmodsw to point to module or driver)
190: */
191: struct streamtab {
192: struct qinit *st_rdinit; /* defines read QUEUE */
193: struct qinit *st_wrinit; /* defines write QUEUE */
194: struct qinit *st_muxrinit; /* for multiplexing drivers only */
195: struct qinit *st_muxwinit; /* for multiplexing drivers only */
196: };
197:
198:
199: struct mpctl; /* for ANSI c */
200:
201:
202: /*
203: * data queue
204: */
205: struct queue { /* internal representation */
206: struct queue *q_next; /* next in stream */
207: struct qinit *q_qinfo; /* queue procedures, limits */
208: struct msgb *q_first; /* first data block */
209: struct msgb *q_last; /* last data block */
210: struct queue *q_link; /* next queue for scheduling */
211: char *q_ptr; /* private data */
212: unsigned long q_count; /* bytes of data on queue */
213: unsigned long q_flag; /* queue state */
214: long q_minpsz; /* min packet size accepted */
215: long q_maxpsz; /* max packet size accepted */
216: unsigned long q_hiwat; /* queue high water mark */
217: unsigned long q_lowat; /* queue low water mark */
218:
219: /* unique to SpiderSTREAMS */
220: struct queue *q_other; /* other queue of pair */
221: struct queue *q_can; /* queue canput() looks at */
222: struct queue *q_back; /* queue to back-enable */
223: struct mpctl *q_mpctl; /* multiprocessor queue info */
224: int q_active; /* # srv/put procs running */
225: KEVENT q_disableproc; /* for disable_procs() */
226: char *q_strmptr; /* at stream head only */
227:
228: /* unused SVR4 fields */
229: void *q_rsvd1; /* q_bandp */
230: unsigned char q_rsvd2; /* q_nband */
231: unsigned char q_pad1[3]; /* reserved for future use */
232: long q_pad2[2]; /* reserved for future use */
233: };
234:
235:
236: /*
237: * Typedefs for important structures
238: */
239: typedef struct msgb mblk_t;
240: typedef struct datab dblk_t;
241: typedef struct free_rtn frtn_t;
242: typedef struct queue queue_t;
243:
244:
245: /*
246: * Priority definitions for block allocation.
247: */
248: #define NPRI 3 /* Number of priority values */
249:
250: #define BPRI_LO 0
251: #define BPRI_MED 1
252: #define BPRI_HI 2
253:
254:
255: /*
256: * Queue flags
257: */
258: #define QSTATE 0x000F /* Queue state mask (see below for values) */
259: #define QREADR 0x0010 /* This is the reader (first) Q */
260: #define QSERV 0x0020 /* This queue has a service proc */
261: #define QEND 0x0040 /* This queue is this stream side end */
262: #define QENABL 0x0100 /* Queue is already enabled to run */
263: #define QNOENB 0x0200 /* Don't enable Q via putq */
264: #define QUSE 0x0400 /* Queue is used */
265: #define QDISABL 0x0800 /* Disable procs can be called */
266:
267: /*
268: * Queue state values (in LS 4 bits of flags)
269: */
270: #define QPRIMED 0x0000 /* Queue was read when empty */
271: #define QEMPTY 0x0001 /* Queue empty but not primed */
272: #define QACTIVE 0x0002 /* Queue not empty and not blocked */
273: #define QBLOCKED 0x0003 /* Queue blocked (canput failed) */
274: #define QFULL QBLOCKED /* Just so it's defined */
275:
276: /*
277: * Finding related queues
278: */
279: #define OTHERQ(Q) ((Q)->q_other)
280: #define WR(Q) ((Q)->q_other)
281: #define RD(Q) ((Q)->q_other)
282:
283:
284: /*
285: * IOCTL structure - this structure is the format of the M_IOCTL message type.
286: *
287: */
288: struct iocblk {
289: int ioc_cmd; /* ioctl command type */
290: unsigned short ioc_uid; /* effective uid of user { *ioc_cr } */
291: unsigned short ioc_gid; /* effective gid of user { in SVR4 } */
292: unsigned int ioc_id; /* ioctl id */
293: unsigned int ioc_count; /* count of bytes in data field */
294: int ioc_error; /* error code */
295: int ioc_rval; /* return value */
296: };
297: /* unprovided SVR4 fields */
298: /* ioc_filler[4] */
299:
300:
301: /*
302: * Link structure for I_LINK and I_UNLINK ioctl's
303: *
304: */
305: struct linkblk {
306: queue_t *l_qtop; /* lowest level write queue of upper stream */
307: queue_t *l_qbot; /* highest level write queue of lower stream */
308: int l_index; /* link index for lower stream */
309: };
310: /* unprovided SVR4 fields */
311: /* l_pad[5] */
312:
313:
314: /*
315: * Options structure for M_SETOPTS message. This is sent upstream
316: * by driver to set stream head options.
317: */
318: struct stroptions {
319: unsigned long so_flags; /* options to set */
320: short so_readopt; /* read option */
321: unsigned short so_wroff; /* write offset */
322: long so_minpsz; /* minimum read packet size */
323: long so_maxpsz; /* maximum read packet size */
324: unsigned long so_hiwat; /* read queue high water mark */
325: unsigned long so_lowat; /* read queue low water mark */
326: unsigned char so_band; /* update water marks for this band */
327: };
328:
329:
330: /*
331: * enumeration for strqset/strqget
332: */
333: typedef enum qfields {
334: QHIWAT = 0, /* q_hiwat or qb_hiwat */
335: QLOWAT = 1, /* q_lowat or qb_lowat */
336: QMAXPSZ = 2, /* q_maxpsz */
337: QMINPSZ = 3, /* q_minpsz */
338: QCOUNT = 4, /* q_count or qb_count */
339: QFIRST = 5, /* q_first or qb_first */
340: QLAST = 6, /* q_last or qb_last */
341: QFLAG = 7, /* q_flag or qb_flag */
342: QBAD = 8
343: } qfields_t;
344:
345:
346: /*
347: * Flags for stream options set message
348: */
349: #define SO_ALL 077 /* set all options */
350: #define SO_READOPT 01 /* set read option */
351: #define SO_WROFF 02 /* set write offset */
352: #define SO_MINPSZ 04 /* set min packet size */
353: #define SO_MAXPSZ 010 /* set max packet size */
354: #define SO_HIWAT 020 /* set high water mark */
355: #define SO_LOWAT 040 /* set low water mark */
356: #define SO_MREADON 0100 /* enable M_READ generation */
357: #define SO_MREADOFF 0200 /* disable M_READ generation */
358: #define SO_NDELON 0400 /* select non-STREAMS tty O_NDELAY semantics */
359: #define SO_NDELOFF 01000 /* select STREAMS O_NDELAY semantics */
360: #define SO_BAND 02000 /* set water marks in a band (unsupported) */
361: #define SO_ISTTY 04000 /* acting as a controlling terminal */
362: #define SO_ISNTTY 010000 /* not acting as a controlling terminal */
363: #define SO_TOSTOP 020000 /* stop on background writes (unsupported) */
364: #define SO_TONSTOP 040000 /* no stop on background writes (unsupported) */
365:
366:
367: /*
368: * SpiderStreams Specific flag - to enable the sending down of an
369: * I_CLOSE ioctl just before calling a drivers close routine
370: */
371: #define SO_I_CLOSE 0100000 /* send I_CLOSE */
372:
373:
374: /*
375: * Data and protocol messages (regular priority)
376: */
377: #define M_DATA 00 /* regular data */
378: #define M_PROTO 01 /* protocol control */
379: #define M_DELAY 014 /* real-time xmit delay (1 param) */
380:
381:
382: /*
383: * Control messages (regular priority)
384: */
385: #define M_BREAK 010 /* line break */
386: #define M_PASSFP 011 /* pass file pointer */
387: #define M_SIG 013 /* generate process signal */
388: #define M_CTL 015 /* device-specific control message */
389: #define M_IOCTL 016 /* ioctl; set/get params */
390: #define M_SETOPTS 020 /* set various stream head options */
391: #define M_RSE 021 /* reserved for internal use */
392:
393:
394: /*
395: * Control messages (high priority; go to head of queue)
396: */
397: #define M_IOCACK 0201 /* acknowledge ioctl */
398: #define M_IOCNAK 0202 /* negative ioctl acknowledge */
399: #define M_PCPROTO 0203 /* priority proto message */
400: #define M_PCSIG 0204 /* generate process signal */
401: #define M_FLUSH 0206 /* flush your queues */
402: #define M_STOP 0207 /* stop transmission immediately */
403: #define M_START 0210 /* restart transmission after stop */
404: #define M_HANGUP 0211 /* line disconnect */
405: #define M_ERROR 0212 /* fatal error used to set u.u_error */
406: #define M_READ 0213 /* sent on read call, if no messages waiting */
407: #define M_STOPI 0214 /* stop input request */
408: #define M_STARTI 0215 /* start input request */
409: #define M_PCRSE 0216 /* reserved for internel use */
410:
411:
412: /*
413: * Queue message class definitions.
414: */
415: #define QNORM 0 /* normal messages */
416: #define QPCTL 0200 /* priority cntrl messages */
417:
418:
419: /*
420: * Define for 2-byte M_ERROR message
421: */
422: #define NOERROR 255
423:
424: /************************************************************/
425: /* Miscellaneous parameters and flags */
426: /************************************************************/
427:
428: /*
429: * Stream head default high/low water marks
430: */
431:
432: #define STRHIGH 5120
433: #define STRLOW 1024
434:
435:
436: /*
437: * Block allocation parameters
438: */
439: #define QBSIZE 65 /* min size for block allocation retries */
440: #define MAXBSIZE 4096 /* max block size */
441: #define MAXIOCBSZ 1024 /* max ioctl data block size */
442:
443:
444: /*
445: * Values for stream flag in open to indicate module open, clone open;
446: * return value for failure.
447: */
448: #define MODOPEN 1 /* open as a module */
449: #define CLONEOPEN 2 /* open for clone, pick own minor device */
450: #define OPENFAIL -1 /* returned for open failure */
451:
452:
453: /*
454: * Value for packet size that denotes infinity
455: */
456: #define INFPSZ -1
457:
458:
459: /*
460: * Flags for flushq()
461: */
462: #define FLUSHALL 1 /* flush all messages */
463: #define FLUSHDATA 0 /* don't flush control messages */
464:
465:
466: /*
467: * Default ioctl/close timeout (seconds)
468: */
469:
470: #define STRTIMOUT 15
471:
472:
473: /************************************************************************/
474: /* Definitions of Streams macros and function interfaces. */
475: /************************************************************************/
476:
477: /*
478: * extract queue class of message block
479: */
480: #define queclass(bp) (bp->b_datap->db_type & QPCTL)
481:
482:
483: /*
484: * Align address on next lower word boundary
485: */
486: #define straln(a) (char *)((long)(a) & ~(sizeof(int)-1))
487:
488:
489:
490: /*
491: * NT-specific definitions for STREAMS Drivers
492: */
493: typedef struct {
494: KSPIN_LOCK spinlock;
495: KIRQL oldlevel;
496: } lock_t;
497:
498:
499: /*
500: * STREAMS <-> TDI interface variable types
501: */
502:
503: #define SHTDI_ADDRESS_COMPARE_BIND 0
504: #define SHTDI_ADDRESS_COMPARE_RECEIVE 1
505:
506: typedef struct {
507: long ADDR_length; // length of broadcast address for this type
508: USHORT AddressType; // Tdi address type
509: BOOLEAN DirectedRouted; // TRUE if a directed message will go farther
510: // than a broadcast or multicast message.
511: PVOID ADDR_ptr; // pointer to broadcast address. NULL if there
512: // isn't one.
513: BOOLEAN (*AddressCompare)(char *, int, char *, int, int);
514: // Function to call to compare two addresses to
515: // see if the provider treats them as equal.
516: // returns TRUE if the addresses are equal.
517: } STREAMS_TDI_ADDRESS_INFO, *PSTREAMS_TDI_ADDRESS_INFO;
518:
519: typedef struct {
520: long SERV_type;
521: struct streamtab * Partner;
522: long PSERV_type;
523: long OPT_length; // length of option string to pass to turn
524: // on TO_REUSE_ADDR
525: PVOID OPT_ptr; // ptr to option string
526: BOOLEAN ReuseAddr; // TRUE if TO_REUSE_ADDR is on by default
527: int AddressInfoCount; // Number of address info structures in the
528: // AddressInfo array.
529:
530: PSTREAMS_TDI_ADDRESS_INFO AddressInfo;
531: // Pointer to the AddressInfo array. There is
532: // one for each address type the provider
533: // supports.
534:
535: } STREAMS_TDI_INFO, *PSTREAMS_TDI_INFO;
536:
537:
538:
539: /*
540: * Definitions for Unix system call and kernel variable emulation
541: *
542: */
543:
544: //
545: // In SVR4, HZ is defined in <sys/param.h> and lbolt declared in <sys\systm.h>.
546: //
547: // However, on NT, we define it here since the value of HZ is intimately tied
548: // to the function, StrmQuerySecondsSince1970Time().
549: //
550: #define HZ 100
551: #define lbolt StrmQueryLbolt()
552:
553:
554:
555: #define bcopy(src, dest, bcount) RtlMoveMemory( \
556: (PVOID) (dest), \
557: (PVOID) (src), \
558: (ULONG) (bcount) \
559: )
560:
561: #define bzero(addr, bcount) RtlZeroMemory( \
562: (PVOID) (addr), \
563: (ULONG) (bcount) \
564: )
565:
566:
567: //
568: // SAMESTR() is not defined in the SVR4 STREAMS Programmer's Guide, but is
569: // a macro in SVR4's <sys/streams.h>. In SpiderSTREAMS it is a function.
570: //
571: int
572: SAMESTR(
573: IN queue_t *q
574: );
575:
576:
577: /*
578: * Definitions for the STREAMS error logging facility
579: */
580: #include <ntiologc.h>
581:
582: /*
583: * Maximum amount of data (binary dump data plus insertion strings) that
584: * can be added to an error log entry.
585: */
586: #define STRM_MAX_ERROR_LOG_DATA_SIZE \
587: ( (ERROR_LOG_MAXIMUM_SIZE - sizeof(IO_ERROR_LOG_PACKET) + 4) & 0xFFFFFFFC )
588:
589:
590:
591: //
592: // NT STREAMS Extensions to the Regular SVR4 STREAMS Utilities
593: //
594:
595: typedef struct _U_UERROR {
596: LIST_ENTRY p_list;
597: struct _KTHREAD * ThreadHandle;
598: char u_error;
599:
600: } U_UERROR, *PU_UERROR;
601:
602:
603: LARGE_INTEGER
604: StrmConvertCentisecondsToRelativeTimeout(
605: unsigned long Centiseconds
606: );
607:
608:
609: NTSTATUS
610: StrmDeregisterDriver(
611: IN PDRIVER_OBJECT driverobject,
612: IN struct streamtab *streamtab
613: );
614:
615: NTSTATUS
616: StrmDeregisterModule(
617: IN PDRIVER_OBJECT driverobject,
618: IN struct streamtab *streamtab
619: );
620:
621: dev_t
622: StrmFindDevno(
623: IN struct streamtab *stab
624: );
625:
626: char
627: StrmGetError(
628: void
629: );
630:
631: time_t
632: StrmQueryLbolt(
633: void
634: );
635:
636: time_t
637: StrmQuerySecondsSince1970Time(
638: void
639: );
640:
641: NTSTATUS
642: StrmRegisterDriver(
643: IN PDRIVER_OBJECT driverobject,
644: IN struct streamtab *streamtab,
645: IN char *subysname OPTIONAL,
646: IN PSTREAMS_TDI_INFO ptdiinfo OPTIONAL
647: );
648:
649: NTSTATUS
650: StrmRegisterModule(
651: IN PDRIVER_OBJECT driverobject,
652: IN struct streamtab *streamtab,
653: IN char *subysname OPTIONAL
654: );
655:
656: VOID
657: StrmSetError(
658: char
659: );
660:
661: int
662: suser(
663: void
664: );
665:
666: NTSTATUS
667: StrmLogEvent(
668: IN PDRIVER_OBJECT DriverObject OPTIONAL,
669: IN NTSTATUS EventCode,
670: IN ULONG UniqueEventValue,
671: IN USHORT NumStrings,
672: IN PCHAR *Strings OPTIONAL,
673: IN ULONG DataSize,
674: IN PVOID Data OPTIONAL
675: );
676:
677: NTSTATUS
678: StrmWaitForMultipleObjects(
679: IN queue_t *Queue,
680: IN CCHAR Count,
681: IN PVOID Object[],
682: IN WAIT_TYPE WaitType,
683: IN KWAIT_REASON WaitReason,
684: IN KPROCESSOR_MODE WaitMode,
685: IN BOOLEAN Alertable,
686: IN PLARGE_INTEGER Timeout OPTIONAL,
687: IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
688: );
689:
690: NTSTATUS
691: StrmWaitForMutexObject(
692: IN queue_t *Queue,
693: IN PKMUTEX Mutex,
694: IN KWAIT_REASON WaitReason,
695: IN KPROCESSOR_MODE WaitMode,
696: IN BOOLEAN Alertable,
697: IN PLARGE_INTEGER Timeout OPTIONAL
698: );
699:
700: NTSTATUS
701: StrmWaitForSingleObject(
702: IN queue_t *Queue,
703: IN PVOID Object,
704: IN KWAIT_REASON WaitReason,
705: IN KPROCESSOR_MODE WaitMode,
706: IN BOOLEAN Alertable,
707: IN PLARGE_INTEGER Timeout OPTIONAL
708: );
709:
710:
711: NTSTATUS
712: StrmOpenRegKey(
713: PHANDLE HandlePtr,
714: PUCHAR KeyName
715: );
716:
717: NTSTATUS
718: StrmGetRegValue(
719: HANDLE KeyHandle,
720: PUCHAR ValueName,
721: PUCHAR ValueData,
722: ULONG ValueLength,
723: PULONG ValueType
724: );
725:
726:
727:
728: /*
729: * General STREAMS functions exported for use by drivers.
730: *
731: * Some of these functions have been renamed and redefined with additional
732: * parameters for debugging purposes. Macros which call the new functions
733: * appear in place of the old ones.
734: */
735:
736: int
737: adjmsg(
738: IN mblk_t *mp,
739: IN int len
740: );
741:
742: mblk_t *
743: allocb(
744: IN int size,
745: IN unsigned int pri
746: );
747:
748: queue_t *
749: backq(
750: IN queue_t *q
751: );
752:
753: int
754: bufcall(
755: IN int size,
756: IN int pri,
757: IN int (*func)(long),
758: IN long arg
759: );
760:
761: int
762: canput(
763: IN queue_t *q
764: );
765:
766: int
767: canputnext(
768: IN queue_t *q
769: );
770:
771: mblk_t *
772: copyb(
773: IN mblk_t *bp
774: );
775:
776: mblk_t *
777: copymsg(
778: IN mblk_t *bp
779: );
780:
781: //
782: // Test if data block type is one of the data messages (i.e. not a
783: // control message).
784: //
785: #define datamsg(type) ((type) == M_DATA || (type) == M_PROTO || \
786: (type) == M_PCPROTO || (type) == M_DELAY)
787:
788: int
789: disable_procs(
790: IN queue_t *q
791: );
792:
793: mblk_t *
794: dupb(
795: IN mblk_t *bp
796: );
797:
798: mblk_t *
799: dupmsg(
800: IN mblk_t *bp
801: );
802:
803: int
804: enable_procs(
805: IN queue_t *q
806: );
807:
808: void
809: enableok(
810: IN queue_t *q
811: );
812:
813: mblk_t *
814: esballoc(
815: IN unsigned char *base,
816: IN int size,
817: IN int pri,
818: IN frtn_t *fr_rtn
819: );
820:
821: int
822: esbbcall(
823: IN int pri,
824: IN int (*func)(long),
825: IN long arg
826: );
827:
828: void
829: flushq(
830: IN queue_t *q,
831: IN int flag
832: );
833:
834: void
835: freeb(
836: IN mblk_t *bp
837: );
838:
839: void
840: freemsg(
841: IN mblk_t *bp
842: );
843:
844: int (*
845: getadmin(
846: IN unsigned short mid
847: ))();
848:
849: unsigned short
850: getmid(
851: IN char *name
852: );
853:
854: mblk_t *
855: getq(
856: IN queue_t *q
857: );
858:
859: /*
860: * void
861: * init_lock(
862: * IN lock_t *lockp
863: * );
864: */
865:
866: #define init_lock(lockp) KeInitializeSpinLock(&((lockp)->spinlock))
867:
868:
869: int
870: insq(
871: IN queue_t *q,
872: IN mblk_t *emp,
873: IN mblk_t *mp
874: );
875:
876: void
877: linkb(
878: IN mblk_t *mp,
879: IN mblk_t *bp
880: );
881:
882: int
883: msgdsize(
884: IN mblk_t *bp
885: );
886:
887: void
888: noenable(
889: IN queue_t *q
890: );
891:
892: /*
893: * int
894: * p_lock (
895: * IN lock_t *lockp,
896: * IN int level
897: * );
898: */
899:
900: #define p_lock(lockp, ignored) \
901: ( KeAcquireSpinLock( \
902: &((lockp)->spinlock), \
903: &((lockp)->oldlevel) \
904: ), \
905: ((int) (lockp)->oldlevel) \
906: )
907:
908: int
909: pullupmsg(
910: IN mblk_t *mp,
911: IN int len
912: );
913:
914: int
915: put(
916: IN queue_t *q,
917: IN mblk_t *mp
918: );
919:
920: int
921: putbq(
922: IN queue_t *q,
923: IN mblk_t *bp
924: );
925:
926: int
927: putctl(
928: IN queue_t *q,
929: IN int type
930: );
931:
932: int
933: putctl1(
934: IN queue_t *q,
935: IN int type,
936: IN int param
937: );
938:
939: int
940: putnext(
941: IN queue_t *q,
942: IN mblk_t *mp
943: );
944:
945: int
946: putnextctl(
947: IN queue_t *q,
948: IN int type
949: );
950:
951: int
952: putnextctl1(
953: IN queue_t *q,
954: IN int type,
955: IN int p
956: );
957:
958: int
959: putq(
960: IN queue_t *q,
961: IN mblk_t *bp
962: );
963:
964: void
965: qenable(
966: IN queue_t *q
967: );
968:
969: void
970: qreply(
971: IN queue_t *q,
972: IN mblk_t *bp
973: );
974:
975: int
976: qsize(
977: IN queue_t *qp
978: );
979:
980: mblk_t *
981: rmvb(
982: IN mblk_t *mp,
983: IN mblk_t *bp
984: );
985:
986: void
987: rmvq(
988: IN queue_t *q,
989: IN mblk_t *mp
990: );
991:
992: int
993: strlog(
994: IN short mid,
995: IN short sid,
996: IN char level,
997: IN unsigned short flags,
998: IN char *fmt,
999: ...
1000: );
1001:
1002: int
1003: strqget(
1004: IN queue_t *q,
1005: IN qfields_t what,
1006: IN unsigned char band,
1007: IN long *valp
1008: );
1009:
1010: int
1011: strqset(
1012: IN queue_t *q,
1013: IN qfields_t what,
1014: IN unsigned char band,
1015: IN long *val
1016: );
1017:
1018: int
1019: testb(
1020: IN int size,
1021: IN unsigned int pri
1022: );
1023:
1024: int
1025: timeout(
1026: IN int (*ftn)(char *),
1027: IN char *arg,
1028: IN long tim
1029: );
1030:
1031: int
1032: unbufcall(
1033: IN int id
1034: );
1035:
1036: mblk_t *
1037: unlinkb(
1038: IN mblk_t *mp
1039: );
1040:
1041: int
1042: untimeout(
1043: IN int seq
1044: );
1045:
1046: /* void
1047: * v_lock (
1048: * IN lock_t *lockp,
1049: * IN int level
1050: * );
1051: *
1052: */
1053:
1054: #define v_lock(lockp, level) \
1055: KeReleaseSpinLock(&((lockp)->spinlock), (KIRQL) (level))
1056:
1057:
1058:
1059: //
1060: // BUGBUG - this include needs to be removed for the final product.
1061: //
1062: #include <debugapi.h>
1063:
1064:
1065:
1066: #endif // _SYS_STREAM_INCLUDED
1067:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.