|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 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: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)timer.c 5.3 (Berkeley) 11/20/85"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Routing Table Management Daemon ! 13: */ ! 14: #include "defs.h" ! 15: ! 16: int timeval = -TIMER_RATE; ! 17: ! 18: /* ! 19: * Timer routine. Performs routing information supply ! 20: * duties and manages timers on routing table entries. ! 21: */ ! 22: timer() ! 23: { ! 24: register struct rthash *rh; ! 25: register struct rt_entry *rt; ! 26: struct rthash *base = hosthash; ! 27: int doinghost = 1, timetobroadcast; ! 28: extern int externalinterfaces; ! 29: ! 30: timeval += TIMER_RATE; ! 31: if (lookforinterfaces && (timeval % CHECK_INTERVAL) == 0) ! 32: ifinit(); ! 33: timetobroadcast = supplier && (timeval % SUPPLY_INTERVAL) == 0; ! 34: again: ! 35: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) { ! 36: rt = rh->rt_forw; ! 37: for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) { ! 38: /* ! 39: * We don't advance time on a routing entry for ! 40: * a passive gateway, or any interface if we're ! 41: * not acting as supplier. ! 42: */ ! 43: if (!(rt->rt_state & RTS_PASSIVE) && ! 44: (supplier || !(rt->rt_state & RTS_INTERFACE))) ! 45: rt->rt_timer += TIMER_RATE; ! 46: if (rt->rt_timer >= EXPIRE_TIME) ! 47: rt->rt_metric = HOPCNT_INFINITY; ! 48: if (rt->rt_timer >= GARBAGE_TIME) { ! 49: rt = rt->rt_back; ! 50: rtdelete(rt->rt_forw); ! 51: continue; ! 52: } ! 53: if (rt->rt_state & RTS_CHANGED) { ! 54: rt->rt_state &= ~RTS_CHANGED; ! 55: /* don't send extraneous packets */ ! 56: if (!supplier || timetobroadcast) ! 57: continue; ! 58: msg->rip_cmd = RIPCMD_RESPONSE; ! 59: msg->rip_vers = RIPVERSION; ! 60: msg->rip_nets[0].rip_dst = rt->rt_dst; ! 61: msg->rip_nets[0].rip_dst.sa_family = ! 62: htons(msg->rip_nets[0].rip_dst.sa_family); ! 63: msg->rip_nets[0].rip_metric = ! 64: htonl(min(rt->rt_metric+1, HOPCNT_INFINITY)); ! 65: toall(sendmsg); ! 66: } ! 67: } ! 68: } ! 69: if (doinghost) { ! 70: doinghost = 0; ! 71: base = nethash; ! 72: goto again; ! 73: } ! 74: if (timetobroadcast) ! 75: toall(supply); ! 76: alarm(TIMER_RATE); ! 77: } ! 78: ! 79: /* ! 80: * On hangup, let everyone know we're going away. ! 81: */ ! 82: hup() ! 83: { ! 84: register struct rthash *rh; ! 85: register struct rt_entry *rt; ! 86: struct rthash *base = hosthash; ! 87: int doinghost = 1; ! 88: ! 89: if (supplier) { ! 90: again: ! 91: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) { ! 92: rt = rh->rt_forw; ! 93: for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) ! 94: rt->rt_metric = HOPCNT_INFINITY; ! 95: } ! 96: if (doinghost) { ! 97: doinghost = 0; ! 98: base = nethash; ! 99: goto again; ! 100: } ! 101: toall(supply); ! 102: } ! 103: exit(1); ! 104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.