|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
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.
11: *
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
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
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.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Reset.c
24: *
25: * From v01.15 07/11/90 mbs
26: */
27: /*
28: * Change log:
29: * 06/29/95 - Modified to handle flow control for writing (Tuyen Nguyen)
30: * Modified for MP, 1996 by Tuyen Nguyen
31: * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
32: */
33:
34: #include <sys/errno.h>
35: #include <sys/types.h>
36: #include <sys/param.h>
37: #include <machine/spl.h>
38: #include <sys/systm.h>
39: #include <sys/kernel.h>
40: #include <sys/proc.h>
41: #include <sys/filedesc.h>
42: #include <sys/fcntl.h>
43: #include <sys/mbuf.h>
44: #include <sys/socket.h>
45: #include <sys/time.h>
46:
47: #include <netat/sysglue.h>
48: #include <netat/appletalk.h>
49: #include <netat/at_pcb.h>
50: #include <netat/debug.h>
51: #include <netat/adsp.h>
52: #include <netat/adsp_internal.h>
53:
54: /*
55: * RXFReset
56: *
57: * We just got a Forward Reset Packet.
58: *
59: * Called with interrupts OFF
60: *
61: * INPUTS:
62: * stream pointer
63: * Pointer to ADSP header,
64: * OUTPUTS:
65: * Returns 1 if packet was ignored
66: */
67: int RXFReset(sp, f) /* (CCBPtr sp, ADSP_FRAMEPtr f) */
68: CCBPtr sp;
69: ADSP_FRAMEPtr f;
70: {
71: unsigned int pktFirstByteSeq;
72: unsigned int hi;
73: register gbuf_t *mp;
74: register struct adspcmd *pb;
75: int s;
76:
77: ATDISABLE(s, sp->lock);
78: pktFirstByteSeq = netdw(UAL_VALUE(f->pktFirstByteSeq));
79:
80: hi = sp->recvSeq + CalcRecvWdw(sp);
81:
82: /*
83: * Must do this with interrupts OFF
84: */
85: if (BETWEEN(sp->recvSeq, pktFirstByteSeq, hi)) /* Is this acceptable? */
86: {
87: sp->recvSeq = pktFirstByteSeq;
88: while (mp = sp->rbuf_mb) { /* clear the receive queue */
89: sp->rbuf_mb = gbuf_next(mp);
90: gbuf_freem(mp);
91: }
92: if (sp->crbuf_mb) {
93: gbuf_freem(sp->crbuf_mb);
94: sp->crbuf_mb = 0;
95: }
96: sp->rData = 0;
97: sp->rbufFull = 0;
98: sp->userFlags |= eFwdReset; /* Set forward reset received Flag */
99:
100: mp = gbuf_alloc(sizeof(struct adspcmd), PRI_HI);
101: pb = (struct adspcmd *)gbuf_rptr(mp);
102: gbuf_winc(mp,sizeof(struct adspcmd));
103: pb->ioc = 0;
104: pb->mp = mp;
105:
106: pb->csCode = dspReset;
107: pb->ioResult = 0;
108: completepb(sp, pb);
109: sp->userFlags &= ~eFwdReset;
110: }
111:
112: if (LTE(pktFirstByteSeq, hi)) {
113: sp->sendCtl |= B_CTL_FRESETACK; /* Ack it if it's OK, or a duplicate */
114: sp->callSend = 1;
115: }
116:
117: ATENABLE(s, sp->lock);
118: return 0;
119: }
120:
121:
122: /*
123: * RXFResetAck
124: *
125: * We just got a Forward Reset Acknowledgement packet
126: *
127: * Called with interrupts OFF
128: *
129: * INPUTS:
130: * stream pointer
131: * Pointer to ADSP header,
132: * OUTPUTS:
133: * Returns 1 if packet was ignored
134: */
135: int RXFResetAck(sp, f) /* (CCBPtr sp, ADSP_FRAMEPtr f) */
136: CCBPtr sp;
137: ADSP_FRAMEPtr f;
138: {
139: unsigned int PktNextRecvSeq;
140: int s;
141:
142: if (sp->frpb == 0) /* Not expecting frwd reset Ack packet */
143: return 1;
144:
145: ATDISABLE(s, sp->lock);
146: PktNextRecvSeq = netdw(UAL_VALUE(f->pktNextRecvSeq));
147:
148: if (BETWEEN(sp->sendSeq, PktNextRecvSeq, sp->sendWdwSeq+1)) {
149: struct adspcmd *pb;
150:
151: RemoveTimerElem(&adspGlobal.fastTimers, &sp->ResetTimer);
152: /* Remove timer */
153:
154: /*
155: * Interrupts are OFF here while we muck with the linked list
156: */
157: pb = sp->frpb; /* Unlink copy of user's parameter block */
158: sp->frpb = (struct adspcmd *)pb->qLink;
159:
160: pb->ioResult = 0;
161: completepb(sp, pb); /* complete(pb, 0); */
162:
163: if (sp->state == sClosing) /* this ack may allow us to close... */
164: CheckOkToClose(sp);
165:
166: if (sp->frpb) /* Another to send? */
167: {
168: sp->callSend = 1;
169: sp->sendCtl |= B_CTL_FRESET;
170: }
171: }
172:
173: ATENABLE(s, sp->lock);
174: return 0;
175: }
176:
177:
178: /*
179: * dspReset
180: *
181: * INPUTS:
182: * --> ccbRefNum refnum of connection end
183: *
184: * OUTPUTS:
185: * none
186: *
187: * ERRORS:
188: * errRefNum bad connection refnum
189: * errState connection is not open
190: * errAborted request aborted by Remove or Close call
191: */
192: int adspReset(sp, pb) /* (DSPPBPtr pb) */
193: CCBPtr sp;
194: struct adspcmd *pb;
195: {
196: int s;
197: register gbuf_t *mp;
198: register struct adspcmd *rpb;
199:
200: if (sp == 0) {
201: pb->ioResult = errRefNum;
202: return EINVAL;
203: }
204:
205: if (sp->state != sOpen) {
206: pb->ioResult = errState;
207: return EINVAL;
208: }
209:
210: ATDISABLE(s, sp->lock);
211:
212: while (mp = sp->sbuf_mb) { /* clear the send queue */
213: sp->sbuf_mb = gbuf_next(mp);
214: gbuf_freem(mp);
215: }
216: if (sp->csbuf_mb) {
217: gbuf_freem(sp->csbuf_mb);
218: sp->csbuf_mb = 0;
219: }
220: sp->sData = 0;
221: sp->writeFlush = 0;
222: sp->sendCtl |= B_CTL_FRESET;
223:
224: sp->firstRtmtSeq = sp->sendSeq; /* Reset sequence #'s */
225: if (mp = gbuf_copym(pb->mp)) { /* copy the parameter block */
226: adspioc_ack(0, pb->ioc, pb->gref); /* release user */
227: rpb = (struct adspcmd *)gbuf_rptr(mp);
228: rpb->ioc = 0; /* unlink copy */
229: rpb->mp = mp;
230:
231: qAddToEnd(&sp->frpb, rpb);
232: /* Hold on to pb (will be completed when */
233: /* forward reset ack is received). */
234: } else { /* assume it will work... but keep no
235: * bookkeeping for it. yetch! */
236: adspioc_ack(0, pb->ioc, pb->gref);
237: }
238: ATENABLE(s, sp->lock);
239:
240: CheckSend(sp);
241: return STR_IGNORE;
242:
243: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.