blob: be136e2644940de62dbd480aefd390c833ccb278 [file] [log] [blame]
jardineb5d44e2003-12-23 08:09:43 +00001/*
2 * IS-IS Rout(e)ing protocol - isis_events.h
3 *
4 * Copyright (C) 2001,2002 Sampo Saaristo
5 * Tampere University of Technology
6 * Institute of Communications Engineering
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public Licenseas published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 */
22#include <stdlib.h>
23#include <stdio.h>
24#include <ctype.h>
25#include <zebra.h>
jardineb5d44e2003-12-23 08:09:43 +000026
27#include "log.h"
28#include "memory.h"
29#include "if.h"
30#include "linklist.h"
31#include "command.h"
32#include "thread.h"
33#include "hash.h"
34#include "prefix.h"
35#include "stream.h"
36
37#include "isisd/dict.h"
38#include "isisd/include-netbsd/iso.h"
39#include "isisd/isis_constants.h"
40#include "isisd/isis_common.h"
41#include "isisd/isis_circuit.h"
42#include "isisd/isis_tlv.h"
43#include "isisd/isis_lsp.h"
44#include "isisd/isis_pdu.h"
45#include "isisd/isis_network.h"
46#include "isisd/isis_misc.h"
47#include "isisd/isis_constants.h"
48#include "isisd/isis_adjacency.h"
49#include "isisd/isis_dr.h"
50#include "isisd/isis_flags.h"
51#include "isisd/isisd.h"
52#include "isisd/isis_csm.h"
53#include "isisd/isis_events.h"
54#include "isisd/isis_spf.h"
55
56extern struct thread_master *master;
57extern struct isis *isis;
58
59/* debug isis-spf spf-events
60 4w4d: ISIS-Spf (tlt): L2 SPF needed, new adjacency, from 0x609229F4
61 4w4d: ISIS-Spf (tlt): L2, 0000.0000.0042.01-00 TLV contents changed, code 0x2
62 4w4d: ISIS-Spf (tlt): L2, new LSP 0 DEAD.BEEF.0043.00-00
63 4w5d: ISIS-Spf (tlt): L1 SPF needed, periodic SPF, from 0x6091C844
64 4w5d: ISIS-Spf (tlt): L2 SPF needed, periodic SPF, from 0x6091C844
65*/
66
67void
68isis_event_circuit_state_change (struct isis_circuit *circuit, int up)
69{
70 struct isis_area *area;
71
72 area = circuit->area;
73 assert (area);
74 area->circuit_state_changes++;
75
76 if (isis->debugs & DEBUG_EVENTS)
77 zlog_info ("ISIS-Evt (%s) circuit %s", circuit->area->area_tag,
78 up ? "up" : "down");
79
80 /*
81 * Regenerate LSPs this affects
82 */
83 lsp_regenerate_schedule (area);
84
85 return;
86}
87
88void
89isis_event_system_type_change (struct isis_area *area, int newtype)
90{
91 struct listnode *node;
92 struct isis_circuit *circuit;
93
94 if (isis->debugs & DEBUG_EVENTS)
95 zlog_info ("ISIS-Evt (%s) system type change %s -> %s", area->area_tag,
96 circuit_t2string (area->is_type), circuit_t2string (newtype));
97
98 if (area->is_type == newtype)
99 return; /* No change */
100
101 switch (area->is_type) {
102 case IS_LEVEL_1:
103 if (area->lspdb[1] == NULL)
104 area->lspdb[1] = lsp_db_init ();
105 lsp_l2_generate (area);
106 break;
107 case IS_LEVEL_1_AND_2:
108 if (newtype == IS_LEVEL_1) {
109 lsp_db_destroy (area->lspdb[1]);
110 }
111 else {
112 lsp_db_destroy (area->lspdb[0]);
113 }
114 break;
115 case IS_LEVEL_2:
116 if (area->lspdb[0] == NULL)
117 area->lspdb[0] = lsp_db_init ();
118 lsp_l1_generate (area);
119 break;
120 default:
121 break;
122 }
123
124 area->is_type = newtype;
125 for (node = listhead (area->circuit_list); node; nextnode (node)) {
126 circuit = getdata (node);
127 isis_event_circuit_type_change (circuit, newtype);
128 }
129
130 spftree_area_init (area);
131 lsp_regenerate_schedule (area);
132
133 return;
134}
135
136
137
138void
139isis_event_area_addr_change (struct isis_area *area)
140{
141
142}
143
144void
145circuit_commence_level (struct isis_circuit *circuit, int level)
146{
147 uint32_t interval;
148
149 if (level == 1) {
hassod70f99e2004-02-11 20:26:31 +0000150 THREAD_TIMER_ON(master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
151 isis_jitter(circuit->psnp_interval[0], PSNP_JITTER));
152
jardineb5d44e2003-12-23 08:09:43 +0000153 if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
154 interval = circuit->hello_multiplier[0] * (circuit->hello_interval[0]);
hassod70f99e2004-02-11 20:26:31 +0000155
156 THREAD_TIMER_ON(master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
jardineb5d44e2003-12-23 08:09:43 +0000157 circuit, interval);
158
hassod70f99e2004-02-11 20:26:31 +0000159 THREAD_TIMER_ON(master, circuit->u.bc.t_send_lan_hello[0],
160 send_lan_l1_hello, circuit,
161 isis_jitter(circuit->hello_interval[0], IIH_JITTER));
162
jardineb5d44e2003-12-23 08:09:43 +0000163 circuit->u.bc.lan_neighs[0] = list_new ();
164 }
165 } else {
hassod70f99e2004-02-11 20:26:31 +0000166 THREAD_TIMER_ON(master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
167 isis_jitter(circuit->psnp_interval[1], PSNP_JITTER));
168
jardineb5d44e2003-12-23 08:09:43 +0000169 if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
170 interval = circuit->hello_multiplier[1] * (circuit->hello_interval[1]);
hassod70f99e2004-02-11 20:26:31 +0000171
172 THREAD_TIMER_ON(master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
jardineb5d44e2003-12-23 08:09:43 +0000173 circuit, interval);
174
hassod70f99e2004-02-11 20:26:31 +0000175 THREAD_TIMER_ON(master, circuit->u.bc.t_send_lan_hello[1],
176 send_lan_l2_hello, circuit,
177 isis_jitter(circuit->hello_interval[1], IIH_JITTER));
178
jardineb5d44e2003-12-23 08:09:43 +0000179 circuit->u.bc.lan_neighs[1] = list_new ();
180 }
181 }
182
183 return;
184}
185
186void
187circuit_resign_level (struct isis_circuit *circuit, int level)
188{
189 int idx = level - 1;
190
hassod70f99e2004-02-11 20:26:31 +0000191 THREAD_TIMER_OFF(circuit->t_send_csnp[idx]);
192 THREAD_TIMER_OFF(circuit->t_send_psnp[idx]);
jardineb5d44e2003-12-23 08:09:43 +0000193
194 if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
hassod70f99e2004-02-11 20:26:31 +0000195 THREAD_TIMER_OFF(circuit->u.bc.t_send_lan_hello[idx]);
196 THREAD_TIMER_OFF(circuit->u.bc.t_run_dr[idx]);
jardineb5d44e2003-12-23 08:09:43 +0000197 circuit->u.bc.run_dr_elect[idx] = 0;
198 }
199
200 return;
201}
202
203void
204isis_event_circuit_type_change (struct isis_circuit *circuit, int newtype)
205{
206
207 if (isis->debugs & DEBUG_EVENTS)
208 zlog_info ("ISIS-Evt (%s) circuit type change %s -> %s",
209 circuit->area->area_tag,
210 circuit_t2string (circuit->circuit_is_type),
211 circuit_t2string (newtype));
212
213 if (circuit->circuit_is_type == newtype)
214 return; /* No change */
215
216 if (!(newtype & circuit->area->is_type)) {
217 zlog_err ("ISIS-Evt (%s) circuit type change - invalid level %s because"
218 " area is %s", circuit->area->area_tag,
219 circuit_t2string (newtype),
220 circuit_t2string (circuit->area->is_type));
221 return;
222 }
223
224 switch (circuit->circuit_is_type) {
225 case IS_LEVEL_1:
226 if (newtype == IS_LEVEL_2)
227 circuit_resign_level (circuit, 1);
228 circuit_commence_level (circuit, 2);
229 break;
230 case IS_LEVEL_1_AND_2:
231 if (newtype == IS_LEVEL_1)
232 circuit_resign_level (circuit, 2);
233 else
234 circuit_resign_level (circuit, 1);
235 break;
236 case IS_LEVEL_2:
237 if (newtype == IS_LEVEL_1)
238 circuit_resign_level (circuit, 2);
239 circuit_commence_level (circuit, 1);
240 break;
241 default:
242 break;
243 }
244
245 circuit->circuit_is_type = newtype;
246 lsp_regenerate_schedule (circuit->area);
247
248 return;
249}
250
251 /* 04/18/2002 by Gwak. */
252 /**************************************************************************
253 *
254 * EVENTS for LSP generation
255 *
256 * 1) an Adajacency or Circuit Up/Down event
257 * 2) a chnage in Circuit metric
258 * 3) a change in Reachable Address metric
259 * 4) a change in manualAreaAddresses
260 * 5) a change in systemID
261 * 6) a change in DIS status
262 * 7) a chnage in the waiting status
263 *
264 * ***********************************************************************
265 *
266 * current support event
267 *
268 * 1) Adjacency Up/Down event
269 * 6) a change in DIS status
270 *
271 * ***********************************************************************/
272
273void
274isis_event_adjacency_state_change (struct isis_adjacency *adj, int newstate)
275{
276 /* adjacency state change event.
277 * - the only proto-type was supported */
278
279 /* invalid arguments */
280 if ( !adj || !adj->circuit || !adj->circuit->area ) return;
281
282 zlog_info ("ISIS-Evt (%s) Adjacency State change",
283 adj->circuit->area->area_tag );
284
285 /* LSP generation again */
286 lsp_regenerate_schedule (adj->circuit->area);
287
288 return;
289}
290
291/* events supporting code */
292
293int
294isis_event_dis_status_change (struct thread *thread)
295{
296 struct isis_circuit *circuit;
297
298 circuit = THREAD_ARG (thread);
299
300 /* invalid arguments */
301 if (!circuit || !circuit->area) return 0;
302
303 zlog_info ("ISIS-Evt (%s) DIS status change", circuit->area->area_tag);
304
305 /* LSP generation again */
306 lsp_regenerate_schedule (circuit->area);
307
308 return 0;
309}
310
311
312void
313isis_event_auth_failure (char *area_tag, char *error_string, char *sysid)
314{
315 zlog_info ("ISIS-Evt (%s) Authentication failure %s from %s",
316 area_tag, error_string, sysid_print (sysid));
317
318 return;
319}
320