1 /*
2 * Copyright (c) 1983, 1988, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)timer.c 8.1 (Berkeley) 06/05/93";
10 #endif /* not lint */
11
12 /*
13 * Routing Table Management Daemon
14 */
15 #include "defs.h"
16
17 int faketime;
18
19 /*
20 * Timer routine. Performs routing information supply
21 * duties and manages timers on routing table entries.
22 * Management of the RTS_CHANGED bit assumes that we broadcast
23 * each time called.
24 */
25 void
timer()26 timer()
27 {
28 register struct rthash *rh;
29 register struct rt_entry *rt;
30 struct rthash *base = hosthash;
31 int doinghost = 1, timetobroadcast;
32 extern int externalinterfaces;
33
34 (void) gettimeofday(&now, (struct timezone *)NULL);
35 faketime += TIMER_RATE;
36 if (lookforinterfaces && (faketime % CHECK_INTERVAL) == 0)
37 ifinit();
38 timetobroadcast = supplier && (faketime % SUPPLY_INTERVAL) == 0;
39 again:
40 for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
41 rt = rh->rt_forw;
42 for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
43 /*
44 * We don't advance time on a routing entry for
45 * a passive gateway, or any interface if we're
46 * not acting as supplier.
47 */
48 if (!(rt->rt_state & RTS_PASSIVE) &&
49 (supplier || !(rt->rt_state & RTS_INTERFACE)))
50 rt->rt_timer += TIMER_RATE;
51 if (rt->rt_timer >= GARBAGE_TIME) {
52 rt = rt->rt_back;
53 rtdelete(rt->rt_forw);
54 continue;
55 }
56 if (rt->rt_timer >= EXPIRE_TIME &&
57 rt->rt_metric < HOPCNT_INFINITY)
58 rtchange(rt, &rt->rt_router, HOPCNT_INFINITY);
59 rt->rt_state &= ~RTS_CHANGED;
60 }
61 }
62 if (doinghost) {
63 doinghost = 0;
64 base = nethash;
65 goto again;
66 }
67 if (timetobroadcast) {
68 toall(supply, 0, (struct interface *)NULL);
69 lastbcast = now;
70 lastfullupdate = now;
71 needupdate = 0; /* cancel any pending dynamic update */
72 nextbcast.tv_sec = 0;
73 }
74 }
75
76 /*
77 * On hangup, let everyone know we're going away.
78 */
hup()79 hup()
80 {
81 register struct rthash *rh;
82 register struct rt_entry *rt;
83 struct rthash *base = hosthash;
84 int doinghost = 1;
85
86 if (supplier) {
87 again:
88 for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
89 rt = rh->rt_forw;
90 for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw)
91 rt->rt_metric = HOPCNT_INFINITY;
92 }
93 if (doinghost) {
94 doinghost = 0;
95 base = nethash;
96 goto again;
97 }
98 toall(supply, 0, (struct interface *)NULL);
99 }
100 exit(1);
101 }
102