blob: aada395dce3c3a48297bef8b4977edd92e316b22 [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>
26#include <net/ethernet.h>
27
28#include "log.h"
29#include "memory.h"
30#include "if.h"
31#include "linklist.h"
32#include "command.h"
33#include "thread.h"
34#include "hash.h"
35#include "prefix.h"
36#include "stream.h"
37
38#include "isisd/dict.h"
39#include "isisd/include-netbsd/iso.h"
40#include "isisd/isis_constants.h"
41#include "isisd/isis_common.h"
42#include "isisd/isis_circuit.h"
43#include "isisd/isis_tlv.h"
44#include "isisd/isis_lsp.h"
45#include "isisd/isis_pdu.h"
46#include "isisd/isis_network.h"
47#include "isisd/isis_misc.h"
48#include "isisd/isis_constants.h"
49#include "isisd/isis_adjacency.h"
50#include "isisd/isis_dr.h"
51#include "isisd/isis_flags.h"
52#include "isisd/isisd.h"
53#include "isisd/isis_csm.h"
54#include "isisd/isis_events.h"
55#include "isisd/isis_spf.h"
56
57extern struct thread_master *master;
58extern struct isis *isis;
59
60/* debug isis-spf spf-events
61 4w4d: ISIS-Spf (tlt): L2 SPF needed, new adjacency, from 0x609229F4
62 4w4d: ISIS-Spf (tlt): L2, 0000.0000.0042.01-00 TLV contents changed, code 0x2
63 4w4d: ISIS-Spf (tlt): L2, new LSP 0 DEAD.BEEF.0043.00-00
64 4w5d: ISIS-Spf (tlt): L1 SPF needed, periodic SPF, from 0x6091C844
65 4w5d: ISIS-Spf (tlt): L2 SPF needed, periodic SPF, from 0x6091C844
66*/
67
68void
69isis_event_circuit_state_change (struct isis_circuit *circuit, int up)
70{
71 struct isis_area *area;
72
73 area = circuit->area;
74 assert (area);
75 area->circuit_state_changes++;
76
77 if (isis->debugs & DEBUG_EVENTS)
78 zlog_info ("ISIS-Evt (%s) circuit %s", circuit->area->area_tag,
79 up ? "up" : "down");
80
81 /*
82 * Regenerate LSPs this affects
83 */
84 lsp_regenerate_schedule (area);
85
86 return;
87}
88
89void
90isis_event_system_type_change (struct isis_area *area, int newtype)
91{
92 struct listnode *node;
93 struct isis_circuit *circuit;
94
95 if (isis->debugs & DEBUG_EVENTS)
96 zlog_info ("ISIS-Evt (%s) system type change %s -> %s", area->area_tag,
97 circuit_t2string (area->is_type), circuit_t2string (newtype));
98
99 if (area->is_type == newtype)
100 return; /* No change */
101
102 switch (area->is_type) {
103 case IS_LEVEL_1:
104 if (area->lspdb[1] == NULL)
105 area->lspdb[1] = lsp_db_init ();
106 lsp_l2_generate (area);
107 break;
108 case IS_LEVEL_1_AND_2:
109 if (newtype == IS_LEVEL_1) {
110 lsp_db_destroy (area->lspdb[1]);
111 }
112 else {
113 lsp_db_destroy (area->lspdb[0]);
114 }
115 break;
116 case IS_LEVEL_2:
117 if (area->lspdb[0] == NULL)
118 area->lspdb[0] = lsp_db_init ();
119 lsp_l1_generate (area);
120 break;
121 default:
122 break;
123 }
124
125 area->is_type = newtype;
126 for (node = listhead (area->circuit_list); node; nextnode (node)) {
127 circuit = getdata (node);
128 isis_event_circuit_type_change (circuit, newtype);
129 }
130
131 spftree_area_init (area);
132 lsp_regenerate_schedule (area);
133
134 return;
135}
136
137
138
139void
140isis_event_area_addr_change (struct isis_area *area)
141{
142
143}
144
145void
146circuit_commence_level (struct isis_circuit *circuit, int level)
147{
148 uint32_t interval;
149
150 if (level == 1) {
151 circuit->t_send_psnp[0] = thread_add_timer (master, send_l1_psnp,
152 circuit,
153 isis_jitter
154 (circuit->psnp_interval[0],
155 PSNP_JITTER));
156 if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
157 interval = circuit->hello_multiplier[0] * (circuit->hello_interval[0]);
158 circuit->u.bc.t_run_dr[0] = thread_add_timer (master, isis_run_dr_l1,
159 circuit, interval);
160
161 circuit->u.bc.t_send_lan_hello[0] =
162 thread_add_timer (master,
163 send_lan_l1_hello,
164 circuit,
165 isis_jitter
166 (circuit->hello_interval[0], IIH_JITTER));
167 circuit->u.bc.lan_neighs[0] = list_new ();
168 }
169 } else {
170 circuit->t_send_psnp[1] = thread_add_timer (master, send_l2_psnp,
171 circuit,
172 isis_jitter
173 (circuit->psnp_interval[1],
174 PSNP_JITTER));
175 if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
176 interval = circuit->hello_multiplier[1] * (circuit->hello_interval[1]);
177 circuit->u.bc.t_run_dr[1] = thread_add_timer (master, isis_run_dr_l2,
178 circuit, interval);
179
180 circuit->u.bc.t_send_lan_hello[1] =
181 thread_add_timer (master,
182 send_lan_l2_hello,
183 circuit,
184 isis_jitter
185 (circuit->hello_interval[1], IIH_JITTER));
186 circuit->u.bc.lan_neighs[1] = list_new ();
187 }
188 }
189
190 return;
191}
192
193void
194circuit_resign_level (struct isis_circuit *circuit, int level)
195{
196 int idx = level - 1;
197
198 if (circuit->t_send_csnp[idx])
199 thread_cancel (circuit->t_send_csnp[idx]);
200 circuit->t_send_csnp[idx] = NULL;
201
202 if (circuit->t_send_psnp[idx])
203 thread_cancel (circuit->t_send_psnp[idx]);
204 circuit->t_send_psnp[level - 1] = NULL;
205
206 if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
207 if (circuit->u.bc.t_send_lan_hello[idx])
208 thread_cancel (circuit->u.bc.t_send_lan_hello[idx]);
209 circuit->u.bc.t_send_lan_hello[idx] = NULL;
210 if (circuit->u.bc.t_run_dr[idx])
211 thread_cancel (circuit->u.bc.t_run_dr[idx]);
212 circuit->u.bc.t_run_dr[idx] = NULL;
213 circuit->u.bc.run_dr_elect[idx] = 0;
214 }
215
216 return;
217}
218
219void
220isis_event_circuit_type_change (struct isis_circuit *circuit, int newtype)
221{
222
223 if (isis->debugs & DEBUG_EVENTS)
224 zlog_info ("ISIS-Evt (%s) circuit type change %s -> %s",
225 circuit->area->area_tag,
226 circuit_t2string (circuit->circuit_is_type),
227 circuit_t2string (newtype));
228
229 if (circuit->circuit_is_type == newtype)
230 return; /* No change */
231
232 if (!(newtype & circuit->area->is_type)) {
233 zlog_err ("ISIS-Evt (%s) circuit type change - invalid level %s because"
234 " area is %s", circuit->area->area_tag,
235 circuit_t2string (newtype),
236 circuit_t2string (circuit->area->is_type));
237 return;
238 }
239
240 switch (circuit->circuit_is_type) {
241 case IS_LEVEL_1:
242 if (newtype == IS_LEVEL_2)
243 circuit_resign_level (circuit, 1);
244 circuit_commence_level (circuit, 2);
245 break;
246 case IS_LEVEL_1_AND_2:
247 if (newtype == IS_LEVEL_1)
248 circuit_resign_level (circuit, 2);
249 else
250 circuit_resign_level (circuit, 1);
251 break;
252 case IS_LEVEL_2:
253 if (newtype == IS_LEVEL_1)
254 circuit_resign_level (circuit, 2);
255 circuit_commence_level (circuit, 1);
256 break;
257 default:
258 break;
259 }
260
261 circuit->circuit_is_type = newtype;
262 lsp_regenerate_schedule (circuit->area);
263
264 return;
265}
266
267 /* 04/18/2002 by Gwak. */
268 /**************************************************************************
269 *
270 * EVENTS for LSP generation
271 *
272 * 1) an Adajacency or Circuit Up/Down event
273 * 2) a chnage in Circuit metric
274 * 3) a change in Reachable Address metric
275 * 4) a change in manualAreaAddresses
276 * 5) a change in systemID
277 * 6) a change in DIS status
278 * 7) a chnage in the waiting status
279 *
280 * ***********************************************************************
281 *
282 * current support event
283 *
284 * 1) Adjacency Up/Down event
285 * 6) a change in DIS status
286 *
287 * ***********************************************************************/
288
289void
290isis_event_adjacency_state_change (struct isis_adjacency *adj, int newstate)
291{
292 /* adjacency state change event.
293 * - the only proto-type was supported */
294
295 /* invalid arguments */
296 if ( !adj || !adj->circuit || !adj->circuit->area ) return;
297
298 zlog_info ("ISIS-Evt (%s) Adjacency State change",
299 adj->circuit->area->area_tag );
300
301 /* LSP generation again */
302 lsp_regenerate_schedule (adj->circuit->area);
303
304 return;
305}
306
307/* events supporting code */
308
309int
310isis_event_dis_status_change (struct thread *thread)
311{
312 struct isis_circuit *circuit;
313
314 circuit = THREAD_ARG (thread);
315
316 /* invalid arguments */
317 if (!circuit || !circuit->area) return 0;
318
319 zlog_info ("ISIS-Evt (%s) DIS status change", circuit->area->area_tag);
320
321 /* LSP generation again */
322 lsp_regenerate_schedule (circuit->area);
323
324 return 0;
325}
326
327
328void
329isis_event_auth_failure (char *area_tag, char *error_string, char *sysid)
330{
331 zlog_info ("ISIS-Evt (%s) Authentication failure %s from %s",
332 area_tag, error_string, sysid_print (sysid));
333
334 return;
335}
336