added -n flag, correct -c output description for newest diff -c
[unix-history] / usr / src / sbin / XNSrouted / timer.c
CommitLineData
5474cc46
KS
1#ifndef lint
2static char rcsid[] = "$Header$";
3#endif
4
5/*
6 * Routing Table Management Daemon
7 */
8#include "defs.h"
9
10int timeval = -TIMER_RATE;
11
12/*
13 * Timer routine. Performs routing information supply
14 * duties and manages timers on routing table entries.
15 */
16timer()
17{
18 register struct rthash *rh;
19 register struct rt_entry *rt;
20 struct rthash *base = hosthash;
21 int doinghost = 1, timetobroadcast;
22
23 timeval += TIMER_RATE;
24 if (lookforinterfaces && (timeval % CHECK_INTERVAL) == 0)
25 ifinit();
26 timetobroadcast = supplier && (timeval % SUPPLY_INTERVAL) == 0;
27again:
28 for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
29 rt = rh->rt_forw;
30 for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
31 /*
32 * We don't advance time on a routing entry for
33 * a passive gateway or that for our only interface.
34 * The latter is excused because we don't act as
35 * a routing information supplier and hence would
36 * time it out. This is fair as if it's down
37 * we're cut off from the world anyway and it's
38 * not likely we'll grow any new hardware in
39 * the mean time.
40 */
41 if (!(rt->rt_state & RTS_PASSIVE) &&
42 (supplier || !(rt->rt_state & RTS_INTERFACE)))
43 rt->rt_timer += TIMER_RATE;
44 if (rt->rt_timer >= EXPIRE_TIME)
45 rt->rt_metric = HOPCNT_INFINITY;
46 if (rt->rt_timer >= GARBAGE_TIME) {
47 rt = rt->rt_back;
48 /* Perhaps we should send a REQUEST for this route? */
49 rtdelete(rt->rt_forw);
50 continue;
51 }
52 if (rt->rt_state & RTS_CHANGED) {
53 rt->rt_state &= ~RTS_CHANGED;
54 /* don't send extraneous packets */
55 if (!supplier || timetobroadcast)
56 continue;
57 msg->rip_cmd = htons(RIPCMD_RESPONSE);
48681466
KS
58 xnnet(msg->rip_nets[0].rip_dst[0]) =
59 ns_netof(satons_addr(rt->rt_dst));
5474cc46
KS
60 msg->rip_nets[0].rip_metric =
61 htons(min(rt->rt_metric+1, HOPCNT_INFINITY));
62 toall(sendmsg);
63 }
64 }
65 }
66 if (doinghost) {
67 doinghost = 0;
68 base = nethash;
69 goto again;
70 }
71 if (timetobroadcast)
72 toall(supply);
73 alarm(TIMER_RATE);
74}
75
76/*
77 * On hangup, let everyone know we're going away.
78 */
79hup()
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) {
87again:
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);
99 }
100 exit(1);
101}