|
|
1.1 root 1: /*
2: * Copyright (c) 1985 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This file includes significant work done at Cornell University by
6: * Bill Nesheim. That work included by permission.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)timer.c 5.6 (Berkeley) 6/1/90";
25: #endif /* not lint */
26:
27: /*
28: * Routing Table Management Daemon
29: */
30: #include "defs.h"
31:
32: int timeval = -TIMER_RATE;
33:
34: /*
35: * Timer routine. Performs routing information supply
36: * duties and manages timers on routing table entries.
37: */
38: timer()
39: {
40: register struct rthash *rh;
41: register struct rt_entry *rt;
42: struct rthash *base = hosthash;
43: int doinghost = 1, timetobroadcast;
44:
45: timeval += TIMER_RATE;
46: if (lookforinterfaces && (timeval % CHECK_INTERVAL) == 0)
47: ifinit();
48: timetobroadcast = supplier && (timeval % SUPPLY_INTERVAL) == 0;
49: again:
50: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
51: rt = rh->rt_forw;
52: for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
53: /*
54: * We don't advance time on a routing entry for
55: * a passive gateway or that for our only interface.
56: * The latter is excused because we don't act as
57: * a routing information supplier and hence would
58: * time it out. This is fair as if it's down
59: * we're cut off from the world anyway and it's
60: * not likely we'll grow any new hardware in
61: * the mean time.
62: */
63: if (!(rt->rt_state & RTS_PASSIVE) &&
64: (supplier || !(rt->rt_state & RTS_INTERFACE)))
65: rt->rt_timer += TIMER_RATE;
66: if (rt->rt_timer >= EXPIRE_TIME)
67: rt->rt_metric = HOPCNT_INFINITY;
68: if (rt->rt_timer >= GARBAGE_TIME) {
69: rt = rt->rt_back;
70: /* Perhaps we should send a REQUEST for this route? */
71: rtdelete(rt->rt_forw);
72: continue;
73: }
74: if (rt->rt_state & RTS_CHANGED) {
75: rt->rt_state &= ~RTS_CHANGED;
76: /* don't send extraneous packets */
77: if (!supplier || timetobroadcast)
78: continue;
79: msg->rip_cmd = htons(RIPCMD_RESPONSE);
80: msg->rip_nets[0].rip_dst =
81: (satons_addr(rt->rt_dst)).x_net;
82: msg->rip_nets[0].rip_metric =
83: htons(min(rt->rt_metric+1, HOPCNT_INFINITY));
84: toall(sendmsg);
85: }
86: }
87: }
88: if (doinghost) {
89: doinghost = 0;
90: base = nethash;
91: goto again;
92: }
93: if (timetobroadcast)
94: toall(supply);
95: alarm(TIMER_RATE);
96: }
97:
98: /*
99: * On hangup, let everyone know we're going away.
100: */
101: hup()
102: {
103: register struct rthash *rh;
104: register struct rt_entry *rt;
105: struct rthash *base = hosthash;
106: int doinghost = 1;
107:
108: if (supplier) {
109: again:
110: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
111: rt = rh->rt_forw;
112: for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw)
113: rt->rt_metric = HOPCNT_INFINITY;
114: }
115: if (doinghost) {
116: doinghost = 0;
117: base = nethash;
118: goto again;
119: }
120: toall(supply);
121: }
122: exit(1);
123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.