new format, add manual page
[unix-history] / usr / src / sbin / XNSrouted / timer.c
CommitLineData
4a10c08d
KS
1/*
2 * Copyright (c) 1985 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
6 * Includes material written at Cornell University by Bill Nesheim,
7 * by permission of the author.
8 */
9
10
5474cc46 11#ifndef lint
84f93e8f 12static char sccsid[] = "@(#)timer.c 5.4 (Berkeley) %G%";
4a10c08d 13#endif not lint
5474cc46
KS
14
15/*
16 * Routing Table Management Daemon
17 */
18#include "defs.h"
19
20int timeval = -TIMER_RATE;
21
22/*
23 * Timer routine. Performs routing information supply
24 * duties and manages timers on routing table entries.
25 */
26timer()
27{
28 register struct rthash *rh;
29 register struct rt_entry *rt;
30 struct rthash *base = hosthash;
31 int doinghost = 1, timetobroadcast;
32
33 timeval += TIMER_RATE;
34 if (lookforinterfaces && (timeval % CHECK_INTERVAL) == 0)
35 ifinit();
36 timetobroadcast = supplier && (timeval % SUPPLY_INTERVAL) == 0;
37again:
38 for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
39 rt = rh->rt_forw;
40 for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
41 /*
42 * We don't advance time on a routing entry for
43 * a passive gateway or that for our only interface.
44 * The latter is excused because we don't act as
45 * a routing information supplier and hence would
46 * time it out. This is fair as if it's down
47 * we're cut off from the world anyway and it's
48 * not likely we'll grow any new hardware in
49 * the mean time.
50 */
51 if (!(rt->rt_state & RTS_PASSIVE) &&
52 (supplier || !(rt->rt_state & RTS_INTERFACE)))
53 rt->rt_timer += TIMER_RATE;
54 if (rt->rt_timer >= EXPIRE_TIME)
55 rt->rt_metric = HOPCNT_INFINITY;
56 if (rt->rt_timer >= GARBAGE_TIME) {
57 rt = rt->rt_back;
58 /* Perhaps we should send a REQUEST for this route? */
59 rtdelete(rt->rt_forw);
60 continue;
61 }
62 if (rt->rt_state & RTS_CHANGED) {
63 rt->rt_state &= ~RTS_CHANGED;
64 /* don't send extraneous packets */
65 if (!supplier || timetobroadcast)
66 continue;
67 msg->rip_cmd = htons(RIPCMD_RESPONSE);
84f93e8f
KS
68 msg->rip_nets[0].rip_dst =
69 (satons_addr(rt->rt_dst)).x_net;
5474cc46
KS
70 msg->rip_nets[0].rip_metric =
71 htons(min(rt->rt_metric+1, HOPCNT_INFINITY));
72 toall(sendmsg);
73 }
74 }
75 }
76 if (doinghost) {
77 doinghost = 0;
78 base = nethash;
79 goto again;
80 }
81 if (timetobroadcast)
82 toall(supply);
83 alarm(TIMER_RATE);
84}
85
86/*
87 * On hangup, let everyone know we're going away.
88 */
89hup()
90{
91 register struct rthash *rh;
92 register struct rt_entry *rt;
93 struct rthash *base = hosthash;
94 int doinghost = 1;
95
96 if (supplier) {
97again:
98 for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
99 rt = rh->rt_forw;
100 for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw)
101 rt->rt_metric = HOPCNT_INFINITY;
102 }
103 if (doinghost) {
104 doinghost = 0;
105 base = nethash;
106 goto again;
107 }
108 toall(supply);
109 }
110 exit(1);
111}