|
|
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: * Copyright (c) 1990, 1996-1998 Apple Computer, Inc.
24: * All Rights Reserved.
25: */
26:
27: /*
28: * Timer.c
29: *
30: * From v01.12 06/22/90 mbs
31: * Modified for MP, 1996 by Tuyen Nguyen
32: * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
33: */
34:
35: #include <sys/errno.h>
36: #include <sys/types.h>
37: #include <sys/param.h>
38: #include <machine/spl.h>
39: #include <sys/systm.h>
40: #include <sys/kernel.h>
41: #include <sys/proc.h>
42: #include <sys/filedesc.h>
43: #include <sys/fcntl.h>
44: #include <sys/mbuf.h>
45: #include <sys/socket.h>
46: #include <sys/time.h>
47:
48: #include <netat/sysglue.h>
49: #include <netat/appletalk.h>
50: #include <netat/at_pcb.h>
51: #include <netat/debug.h>
52: #include <netat/adsp.h>
53: #include <netat/adsp_internal.h>
54:
55: /*
56: * TrashSession
57: *
58: * Cleanly abort a session that might be open. Called if probe timer expires,
59: * or from AppleTalk event handler (close or network gone away)
60: *
61: * Only call if the session is active (I.e. not for closed or listeners)
62: *
63: * INPUTS:
64: * session pointer
65: * OUTPUTS:
66: * none
67: */
68: void TrashSession(sp) /* (CCBPtr sp) */
69: CCBPtr sp;
70: {
71: int s;
72:
73: ATDISABLE(s, sp->lock);
74: sp->userFlags |= eTearDown;
75: sp->removing = 1;
76: sp->state = sClosed;
77: ATENABLE(s, sp->lock);
78:
79: DoClose(sp, errAborted, 1);
80: }
81:
82:
83: /*
84: * DoTimerElem
85: *
86: * INPUTS:
87: *
88: * OUTPUTS:
89: *
90: */
91: void DoTimerElem(t) /* (TimerElemPtr t) */
92: TimerElemPtr t;
93: {
94: CCBPtr sp;
95: int s;
96:
97: sp = (CCBPtr)((Ptr)t - t->type); /* Recover stream pointer for this guy */
98: ATDISABLE(s, sp->lock);
99:
100: if (t->type == kFlushTimerType) { /* flush write data time just fired */
101: if (sp->sData) { /* If there's any data, flush it. */
102: sp->writeFlush = 1;
103: goto send;
104: }
105: } else if (t->type == kRetryTimerType) {
106: if (sp->waitingAck) {
107:
108: sp->waitingAck = 0;
109: sp->sendSeq = sp->firstRtmtSeq;
110: sp->pktSendCnt = 0;
111: sp->resentData = 1; /* Had to resend data */
112: sp->noXmitFlow = 1; /* Don't incr. max packets. */
113:
114: if ((sp->pktSendMax /= 2) == 0) /* Back off on max # packets
115: * sent */
116: sp->pktSendMax = 1;
117:
118: if ((sp->roundTrip *= 2) > sp->probeInterval)
119: sp->roundTrip = sp->probeInterval;
120: sp->rtmtInterval = sp->roundTrip + ((short)2 *
121: (short)sp->deviation);
122: goto send;
123: }
124: } else if (t->type == kAttnTimerType) {
125: if (sp->sapb) { /* Unacknowledged attn pkt */
126: sp->sendAttnData = 1;
127: goto send;
128: }
129: } else if (t->type == kResetTimerType) {
130: if (sp->frpb) { /* Unacknowledged forward reset */
131: sp->sendCtl |= B_CTL_FRESET;
132: goto send;
133: }
134: } else if (t->type == kProbeTimerType) {
135: if (sp->state == sOpen || sp->state == sClosing) {
136: if (--sp->probeCntr == 0) { /* Connection died */
137: ATENABLE(s, sp->lock);
138: TrashSession(sp);
139: return;
140: } else {
141: InsertTimerElem(&adspGlobal.slowTimers, &sp->ProbeTimer,
142: sp->probeInterval);
143: sp->sendCtl |= B_CTL_PROBE;
144: goto send;
145: }
146: } else if (sp->state == sOpening) {
147: if ((sp->openState == O_STATE_OPENWAIT) ||
148: (sp->openState == O_STATE_ESTABLISHED))
149: {
150: if (--sp->openRetrys == 0) { /* Oops, didn't open */
151: sp->state = sClosed;
152: ATENABLE(s, sp->lock);
153: DoClose(sp, errOpening, 1);
154: return;
155: } /* open failed */
156: else /* Send packet again */
157: {
158: sp->sendCtl |= (sp->openState == O_STATE_OPENWAIT) ?
159: B_CTL_OREQ : B_CTL_OREQACK;
160: goto send;
161: }
162: } /* we're opening */
163: }
164: }
165:
166: else {
167: dPrintf(D_M_ADSP, D_L_ERROR, ("DoTimerElem:Unknown timer type!\n"));
168: }
169:
170: ATENABLE(s, sp->lock);
171: return;
172:
173: send:
174: ATENABLE(s, sp->lock);
175: CheckSend(sp);
176: }
177:
178: static StopTimer;
179:
180: /*
181: * TimerTick
182: *
183: * Called 6 times per second
184: * INPUTS:
185: *
186: * OUTPUTS:
187: *
188: */
189: void TimerTick() /* (void) */
190: {
191: if (StopTimer)
192: return;
193: TimerQueueTick(&adspGlobal.slowTimers);
194: TimerQueueTick(&adspGlobal.fastTimers);
195: timeout(TimerTick, (caddr_t)0, HZ/6);
196: }
197:
198: void TimerStop()
199: {
200: StopTimer = 1;
201: untimeout(TimerTick, (caddr_t) 0);
202: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.