OSDN Git Service

Add MS7619SE
[uclinux-h8/uClinux-dist.git] / user / routed / timer.c
1 /*
2  * Copyright (c) 1983, 1988, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 /*
35  * From: @(#)timer.c    5.10 (Berkeley) 2/28/91 
36  * From: @(#)timer.c    8.1 (Berkeley) 6/5/93
37  */
38 char timer_rcsid[] = 
39   "$Id: timer.c,v 1.7 1999/08/01 22:39:59 dholland Exp $";
40
41
42 /*
43  * Routing Table Management Daemon
44  */
45 #include "defs.h"
46
47 static int faketime;
48
49 /*
50  * Timer routine.  Performs routing information supply
51  * duties and manages timers on routing table entries.
52  * Management of the RTS_CHANGED bit assumes that we broadcast
53  * each time called.
54  */
55
56 void timer(int signum)
57 {
58         register struct rthash *rh;
59         register struct rt_entry *rt;
60         struct rthash *base = hosthash;
61         int doinghost = 1, timetobroadcast;
62
63         (void)signum;
64
65         (void) gettimeofday(&now, (struct timezone *)NULL);
66         faketime += TIMER_RATE;
67         if (lookforinterfaces && (faketime % CHECK_INTERVAL) == 0)
68                 ifinit();
69         timetobroadcast = supplier && (faketime % SUPPLY_INTERVAL) == 0;
70 again:
71         for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
72                 rt = rh->rt_forw;
73                 for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw) {
74                         /*
75                          * We don't advance time on a routing entry for
76                          * a passive gateway, or any interface if we're
77                          * not acting as supplier.
78                          */
79                         if (!(rt->rt_state & RTS_PASSIVE) &&
80                             (supplier || !(rt->rt_state & RTS_INTERFACE)))
81                                 rt->rt_timer += TIMER_RATE;
82                         if (rt->rt_timer >= GARBAGE_TIME) {
83                                 rt = rt->rt_back;
84                                 rtdelete(rt->rt_forw);
85                                 continue;
86                         }
87                         if (rt->rt_timer >= EXPIRE_TIME &&
88                             rt->rt_metric < HOPCNT_INFINITY)
89                                 rtchange(rt, &rt->rt_router, HOPCNT_INFINITY);
90                         rt->rt_state &= ~RTS_CHANGED;
91                 }
92         }
93         if (doinghost) {
94                 doinghost = 0;
95                 base = nethash;
96                 goto again;
97         }
98         if (timetobroadcast) {
99                 toall(supply, 0, (struct interface *)NULL);
100                 lastbcast = now;
101                 lastfullupdate = now;
102                 needupdate = 0;         /* cancel any pending dynamic update */
103                 nextbcast.tv_sec = 0;
104         }
105 #ifdef EMBED
106         signal(signum, timer);
107 #endif
108 }
109
110 /*
111  * On hangup, let everyone know we're going away.
112  */
113  
114 void hup(int signum)
115 {
116         register struct rthash *rh;
117         register struct rt_entry *rt;
118         struct rthash *base = hosthash;
119         int doinghost = 1;
120
121         (void)signum;
122
123         if (supplier) {
124 again:
125                 for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) {
126                         rt = rh->rt_forw;
127                         for (; rt != (struct rt_entry *)rh; rt = rt->rt_forw)
128                                 rt->rt_metric = HOPCNT_INFINITY;
129                 }
130                 if (doinghost) {
131                         doinghost = 0;
132                         base = nethash;
133                         goto again;
134                 }
135                 toall(supply, 0, (struct interface *)NULL);
136         }
137         exit(1);
138 }