* Copyright (c) 1985 The Regents of the University of California.
* This file includes significant work done at Cornell University by
* Bill Nesheim. That work included by permission.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)timer.c 5.7 (Berkeley) 2/26/91";
* 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
) {
/* Perhaps we should send a REQUEST for this route? */
if (rt
->rt_state
& RTS_CHANGED
) {
rt
->rt_state
&= ~RTS_CHANGED
;
/* don't send extraneous packets */
if (!supplier
|| timetobroadcast
)
msg
->rip_cmd
= htons(RIPCMD_RESPONSE
);
msg
->rip_nets
[0].rip_dst
=
(satons_addr(rt
->rt_dst
)).x_net
;
msg
->rip_nets
[0].rip_metric
=
htons(min(rt
->rt_metric
+1, HOPCNT_INFINITY
));
* On hangup, let everyone know we're going away.
register struct rthash
*rh
;
register struct rt_entry
*rt
;
struct rthash
*base
= hosthash
;
for (rh
= base
; rh
< &base
[ROUTEHASHSIZ
]; rh
++) {
for (; rt
!= (struct rt_entry
*)rh
; rt
= rt
->rt_forw
)
rt
->rt_metric
= HOPCNT_INFINITY
;