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