]> git.saurik.com Git - apple/xnu.git/blame - bsd/netat/adsp_Timer.c
xnu-792.6.61.tar.gz
[apple/xnu.git] / bsd / netat / adsp_Timer.c
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
37839358
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 *
37839358
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,
37839358
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 * 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
55e303ae
A
55void TimerTick();
56
1c79356b
A
57/*
58 * TrashSession
59 *
60 * Cleanly abort a session that might be open. Called if probe timer expires,
61 * or from AppleTalk event handler (close or network gone away)
62 *
63 * Only call if the session is active (I.e. not for closed or listeners)
64 *
65 * INPUTS:
66 * session pointer
67 * OUTPUTS:
68 * none
69 */
70void TrashSession(sp) /* (CCBPtr sp) */
71 CCBPtr sp;
72{
73 int s;
74
75 ATDISABLE(s, sp->lock);
76 sp->userFlags |= eTearDown;
77 sp->removing = 1;
78 sp->state = sClosed;
79 ATENABLE(s, sp->lock);
80
81 DoClose(sp, errAborted, 1);
82}
83
84
85/*
86 * DoTimerElem
87 *
88 * INPUTS:
89 *
90 * OUTPUTS:
91 *
92 */
93void DoTimerElem(t) /* (TimerElemPtr t) */
94 TimerElemPtr t;
95{
96 CCBPtr sp;
97 int s;
98
99 sp = (CCBPtr)((Ptr)t - t->type); /* Recover stream pointer for this guy */
100 ATDISABLE(s, sp->lock);
101
102 if (t->type == kFlushTimerType) { /* flush write data time just fired */
103 if (sp->sData) { /* If there's any data, flush it. */
104 sp->writeFlush = 1;
105 goto send;
106 }
107 } else if (t->type == kRetryTimerType) {
108 if (sp->waitingAck) {
109
110 sp->waitingAck = 0;
111 sp->sendSeq = sp->firstRtmtSeq;
112 sp->pktSendCnt = 0;
113 sp->resentData = 1; /* Had to resend data */
114 sp->noXmitFlow = 1; /* Don't incr. max packets. */
115
116 if ((sp->pktSendMax /= 2) == 0) /* Back off on max # packets
117 * sent */
118 sp->pktSendMax = 1;
119
120 if ((sp->roundTrip *= 2) > sp->probeInterval)
121 sp->roundTrip = sp->probeInterval;
122 sp->rtmtInterval = sp->roundTrip + ((short)2 *
123 (short)sp->deviation);
124 goto send;
125 }
126 } else if (t->type == kAttnTimerType) {
127 if (sp->sapb) { /* Unacknowledged attn pkt */
128 sp->sendAttnData = 1;
129 goto send;
130 }
131 } else if (t->type == kResetTimerType) {
132 if (sp->frpb) { /* Unacknowledged forward reset */
133 sp->sendCtl |= B_CTL_FRESET;
134 goto send;
135 }
136 } else if (t->type == kProbeTimerType) {
137 if (sp->state == sOpen || sp->state == sClosing) {
138 if (--sp->probeCntr == 0) { /* Connection died */
139 ATENABLE(s, sp->lock);
140 TrashSession(sp);
141 return;
142 } else {
143 InsertTimerElem(&adspGlobal.slowTimers, &sp->ProbeTimer,
144 sp->probeInterval);
145 sp->sendCtl |= B_CTL_PROBE;
146 goto send;
147 }
148 } else if (sp->state == sOpening) {
149 if ((sp->openState == O_STATE_OPENWAIT) ||
150 (sp->openState == O_STATE_ESTABLISHED))
151 {
152 if (--sp->openRetrys == 0) { /* Oops, didn't open */
153 sp->state = sClosed;
154 ATENABLE(s, sp->lock);
155 DoClose(sp, errOpening, 1);
156 return;
157 } /* open failed */
158 else /* Send packet again */
159 {
160 sp->sendCtl |= (sp->openState == O_STATE_OPENWAIT) ?
161 B_CTL_OREQ : B_CTL_OREQACK;
162 goto send;
163 }
164 } /* we're opening */
165 }
166 }
167
168 else {
169 dPrintf(D_M_ADSP, D_L_ERROR, ("DoTimerElem:Unknown timer type!\n"));
170 }
171
172 ATENABLE(s, sp->lock);
173 return;
174
175send:
176 ATENABLE(s, sp->lock);
177 CheckSend(sp);
178}
179
55e303ae 180void TimerTick_funnel(void *arg)
1c79356b 181{
91447636 182 atalk_lock();
1c79356b 183 TimerTick();
91447636 184 atalk_unlock();
1c79356b
A
185}
186
187static StopTimer;
188
189/*
190 * TimerTick
191 *
192 * Called 6 times per second
193 * INPUTS:
194 *
195 * OUTPUTS:
196 *
197 */
198void TimerTick() /* (void) */
199{
200
201 if (StopTimer) {
202 return;
203 }
204 TimerQueueTick(&adspGlobal.slowTimers);
205 TimerQueueTick(&adspGlobal.fastTimers);
206 timeout(TimerTick_funnel, (caddr_t)0, HZ/6);
207}
208
209void TimerStop()
210{
211 StopTimer = 1;
212 untimeout(TimerTick_funnel, (caddr_t) 0);
213}