static char sccsid
[] = "@(#)timer.c 4.2 %G%";
* Routing Table Management Daemon
int timeval
= -TIMER_RATE
;
* Timer routine. Performs routing information supply
* duties and manages timers on routing table entries.
register struct rthash
*rh
;
register struct rt_entry
*rt
;
struct rthash
*base
= hosthash
;
int doinghost
= 1, timetobroadcast
;
if (lookforinterfaces
&& (timeval
% CHECK_INTERVAL
) == 0)
timetobroadcast
= supplier
&& (timeval
% SUPPLY_INTERVAL
) == 0;
for (rh
= base
; rh
< &base
[ROUTEHASHSIZ
]; rh
++) {
for (; rt
!= (struct rt_entry
*)rh
; rt
= rt
->rt_forw
) {
* We don't advance time on a routing entry for
* a passive gateway or that for our only interface.
* The latter is excused because we don't act as
* a routing information supplier and hence would
* time it out. This is fair as if it's down
* we're cut off from the world anyway and it's
* not likely we'll grow any new hardware in
if (!(rt
->rt_state
& RTS_PASSIVE
) &&
(supplier
|| !(rt
->rt_state
& RTS_INTERFACE
)))
rt
->rt_timer
+= TIMER_RATE
;
if (rt
->rt_timer
>= EXPIRE_TIME
)
rt
->rt_metric
= HOPCNT_INFINITY
;
if (rt
->rt_timer
>= GARBAGE_TIME
) {
if (rt
->rt_state
& RTS_CHANGED
) {
rt
->rt_state
&= ~RTS_CHANGED
;
/* don't send extraneous packets */
if (!supplier
|| timetobroadcast
)
msg
->rip_cmd
= RIPCMD_RESPONSE
;
msg
->rip_nets
[0].rip_dst
= rt
->rt_dst
;
msg
->rip_nets
[0].rip_metric
=
min(rt
->rt_metric
+1, HOPCNT_INFINITY
);