]> git.saurik.com Git - apple/xnu.git/blob - bsd/netat/adsp_Status.c
74d0d74bb6debeb7e9f03b6a8a112052d82b07e1
[apple/xnu.git] / bsd / netat / adsp_Status.c
1 /*
2 * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the
10 * License may not be used to create, or enable the creation or
11 * redistribution of, unlawful or unlicensed copies of an Apple operating
12 * system, or to circumvent, violate, or enable the circumvention or
13 * violation of, any terms of an Apple operating system software license
14 * agreement.
15 *
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
18 * file.
19 *
20 * The Original Code and all software distributed under the License are
21 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
22 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
23 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
25 * Please see the License for the specific language governing rights and
26 * limitations under the License.
27 *
28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
29 */
30 /*
31 * dspStatus.c
32 *
33 * From Mike Shoemaker v01.04 06/15/90 mbs
34 * Modified for MP, 1996 by Tuyen Nguyen
35 * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
36 */
37
38 #include <sys/errno.h>
39 #include <sys/types.h>
40 #include <sys/param.h>
41 #include <machine/spl.h>
42 #include <sys/systm.h>
43 #include <sys/kernel.h>
44 #include <sys/proc.h>
45 #include <sys/filedesc.h>
46 #include <sys/fcntl.h>
47 #include <sys/mbuf.h>
48 #include <sys/socket.h>
49
50 #include <netat/sysglue.h>
51 #include <netat/appletalk.h>
52 #include <netat/at_pcb.h>
53 #include <netat/adsp.h>
54 #include <netat/adsp_internal.h>
55
56 /*
57 * calcSendFree
58 *
59 * INPUTS:
60 * sp ADSP Stream
61 * OUTPUTS:
62 * # of bytes avail in local send queue
63 */
64 int CalcSendQFree(sp) /* (CCBPtr sp) */
65 CCBPtr sp;
66 {
67 int bytes;
68
69 bytes = calcSendQ(sp);
70 bytes = sp->sbuflen - bytes;
71
72 if (bytes < 0)
73 return 0;
74 return bytes;
75 }
76
77 calcSendQ(sp)
78 CCBPtr sp;
79 {
80 register gbuf_t *mp;
81 int bytes = 0;
82
83 if (sp->sData) { /* There is data in buffer */
84 if (mp = sp->sbuf_mb) {
85 do {
86 bytes += gbuf_msgsize(mp);
87 mp = gbuf_next(mp);
88 } while (mp);
89 }
90 if (mp = sp->csbuf_mb)
91 bytes += gbuf_msgsize(mp);
92 }
93 return bytes;
94 }
95
96 /*
97 * dspStatus
98 *
99 * INPUTS:
100 * --> ccbRefNum refnum of connection end
101 *
102 * OUTPUTS:
103 * <-- statusCCB Pointer to the connection control block
104 * <-- sendQPending bytes waiting to be sent or acknowledged
105 * <-- sendQFree available buffer in bytes of send queue
106 * <-- recvQPending bytes waiting to be read from queue
107 * <-- recvQFree available buffer in bytes of receive queue
108 *
109 * ERRORS:
110 * errRefNum bad connection refnum
111 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
112 */
113 int adspStatus(sp, pb) /* (DSPPBPtr pb) */
114 CCBPtr sp;
115 register struct adspcmd *pb;
116 {
117 short err;
118 short bytes;
119 int s;
120
121 if (sp == 0) {
122 pb->ioResult = errRefNum;
123 return EINVAL;
124 }
125
126 pb->u.statusParams.ccbPtr = (TPCCB)sp;
127 ATDISABLE(s, sp->lock);
128
129 /*
130 * pending bytes in send queue
131 */
132 if (sp->sData)
133 bytes = calcSendQ(sp);
134 else
135 bytes = 0;
136 pb->u.statusParams.sendQPending = bytes;
137
138 /* available buffer space in send queue */
139 pb->u.statusParams.sendQFree = CalcSendQFree(sp);
140
141 /*
142 * pending bytes in recv queue
143 */
144 if (sp->rData)
145 bytes = calcRecvQ(sp);
146 else
147 bytes = 0;
148 pb->u.statusParams.recvQPending = bytes;
149
150 /* available buffer space in receive queue */
151 pb->u.statusParams.recvQFree = CalcRecvWdw(sp);
152
153 ATENABLE(s, sp->lock);
154 pb->ioResult = 0;
155 adspioc_ack(0, pb->ioc, pb->gref);
156 return 0;
157
158 }