sbin/routed/timer.c
/*
 * Timer routine.  Performs routing information supply
 * duties and manages timers on routing table entries.
 * Management of the RTS_CHANGED bit assumes that we broadcast
 * each time called.
 */
Timer routine.  Performs routing information supply
duties and manages timers on routing table entries.
Management of the RTS_CHANGED bit assumes that we broadcast
each time called.
Timer routine . Performs routing information supply duties and manages timers on routing table entries . Management of the RTS_CHANGED bit assumes that we broadcast each time called .
void
timer()
{
	register struct rthash *rh;
	register struct rt_entry *rt;
	struct rthash *base = hosthash;
	int doinghost = 1, timetobroadcast;
	extern int externalinterfaces;
	(void) gettimeofday(&now, (struct timezone *)NULL);
	faketime += TIMER_RATE;
	if (lookforinterfaces && (faketime % CHECK_INTERVAL) == 0)
		ifinit();
	timetobroadcast = supplier && (faketime % SUPPLY_INTERVAL) == 0;
again:
	for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
		rt = rh->rt_forw;
		for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
			if (!(rt->rt_state & RTS_PASSIVE) &&
			    (supplier || !(rt->rt_state & RTS_INTERFACE)))
				rt->rt_timer += TIMER_RATE;
			if (rt->rt_timer >= GARBAGE_TIME) {
				rt = rt->rt_back;
				rtdelete(rt->rt_forw);
				continue;
			}
			if (rt->rt_timer >= EXPIRE_TIME &&
			    rt->rt_metric < HOPCNT_INFINITY)
				rtchange(rt, &rt->rt_router, HOPCNT_INFINITY);
			rt->rt_state &= ~RTS_CHANGED;
		}
	}
	if (doinghost) {
		doinghost = 0;
		base = nethash;
		goto again;
	}
	if (timetobroadcast) {
		toall(supply, 0, (struct interface *)NULL);
		lastbcast = now;
		lastfullupdate = now;
		needupdate = 0;		
		nextbcast.tv_sec = 0;
	}
}
void timer ( ) { register struct rthash * rh ; register struct rt_entry * rt ; struct rthash * base = hosthash ; int doinghost = 1 , timetobroadcast ; extern int externalinterfaces ; ( void ) gettimeofday ( & now , ( struct timezone * ) NULL ) ; faketime += TIMER_RATE ; if ( lookforinterfaces && ( faketime % CHECK_INTERVAL ) == 0 ) ifinit ( ) ; timetobroadcast = supplier && ( faketime % SUPPLY_INTERVAL ) == 0 ; again : for ( rh = base ; rh < & base [ ROUTEHASHSIZ ] ; rh ++ ) { rt = rh -> rt_forw ; for ( ; rt != ( struct rt_entry * ) rh ; rt = rt -> rt_forw ) { if ( ! ( rt -> rt_state & RTS_PASSIVE ) && ( supplier || ! ( rt -> rt_state & RTS_INTERFACE ) ) ) rt -> rt_timer += TIMER_RATE ; if ( rt -> rt_timer >= GARBAGE_TIME ) { rt = rt -> rt_back ; rtdelete ( rt -> rt_forw ) ; continue ; } if ( rt -> rt_timer >= EXPIRE_TIME && rt -> rt_metric < HOPCNT_INFINITY ) rtchange ( rt , & rt -> rt_router , HOPCNT_INFINITY ) ; rt -> rt_state &= ~ RTS_CHANGED ; } } if ( doinghost ) { doinghost = 0 ; base = nethash ; goto again ; } if ( timetobroadcast ) { toall ( supply , 0 , ( struct interface * ) NULL ) ; lastbcast = now ; lastfullupdate = now ; needupdate = 0 ; nextbcast . tv_sec = 0 ; } }
Timer routine.
Timer routine .
/*
			 * We don't advance time on a routing entry for
			 * a passive gateway, or any interface if we're
			 * not acting as supplier.
			 */ /* cancel any pending dynamic update */