|
|
1.1 root 1: /*
2: * Copyright (c) 1983, 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that this notice is preserved and that due credit is given
7: * to the University of California at Berkeley. The name of the University
8: * may not be used to endorse or promote products derived from this
9: * software without specific prior written permission. This software
10: * is provided ``as is'' without express or implied warranty.
11: */
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)timer.c 5.6 (Berkeley) 5/31/88";
15: #endif /* not lint */
16:
17: /*
18: * Routing Table Management Daemon
19: */
20: #include "defs.h"
21:
22: int timeval = -TIMER_RATE;
23:
24: /*
25: * Timer routine. Performs routing information supply
26: * duties and manages timers on routing table entries.
27: */
28: timer()
29: {
30: register struct rthash *rh;
31: register struct rt_entry *rt;
32: struct rthash *base = hosthash;
33: int doinghost = 1, timetobroadcast, changes = 0;
34: extern int externalinterfaces;
35: time_t now;
36:
37: timeval += TIMER_RATE;
38: if (lookforinterfaces && (timeval % CHECK_INTERVAL) == 0)
39: ifinit();
40: timetobroadcast = supplier && (timeval % SUPPLY_INTERVAL) == 0;
41: again:
42: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
43: rt = rh->rt_forw;
44: for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
45: /*
46: * We don't advance time on a routing entry for
47: * a passive gateway, or any interface if we're
48: * not acting as supplier.
49: */
50: if (!(rt->rt_state & RTS_PASSIVE) &&
51: (supplier || !(rt->rt_state & RTS_INTERFACE)))
52: rt->rt_timer += TIMER_RATE;
53: if (rt->rt_timer >= GARBAGE_TIME) {
54: rt = rt->rt_back;
55: rtdelete(rt->rt_forw);
56: continue;
57: }
58: if (rt->rt_timer >= EXPIRE_TIME) {
59: if (traceactions && changes++ == 0) {
60: (void) time(&now);
61: curtime = ctime(&now);
62: }
63: rtchange(rt, &rt->rt_router, HOPCNT_INFINITY);
64: }
65: if (rt->rt_state & RTS_CHANGED) {
66: rt->rt_state &= ~RTS_CHANGED;
67: /* don't send extraneous packets */
68: if (!supplier || timetobroadcast)
69: continue;
70: msg->rip_cmd = RIPCMD_RESPONSE;
71: msg->rip_vers = RIPVERSION;
72: msg->rip_nets[0].rip_dst = rt->rt_dst;
73: msg->rip_nets[0].rip_dst.sa_family =
74: htons(msg->rip_nets[0].rip_dst.sa_family);
75: msg->rip_nets[0].rip_metric =
76: htonl(min(rt->rt_metric, HOPCNT_INFINITY));
77: toall(sendmsg);
78: }
79: }
80: }
81: if (doinghost) {
82: doinghost = 0;
83: base = nethash;
84: goto again;
85: }
86: if (timetobroadcast)
87: toall(supply);
88: alarm(TIMER_RATE);
89: }
90:
91: /*
92: * On hangup, let everyone know we're going away.
93: */
94: hup()
95: {
96: register struct rthash *rh;
97: register struct rt_entry *rt;
98: struct rthash *base = hosthash;
99: int doinghost = 1;
100:
101: if (supplier) {
102: again:
103: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
104: rt = rh->rt_forw;
105: for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw)
106: rt->rt_metric = HOPCNT_INFINITY;
107: }
108: if (doinghost) {
109: doinghost = 0;
110: base = nethash;
111: goto again;
112: }
113: toall(supply);
114: }
115: exit(1);
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.